ARC111A Simple Maths 2

Simple Maths 2

题目传送门

如题目所说,这是一道简单数学题。

题目的意思就是求 \(\lfloor\frac{10^n}{m}\rfloor\) 除以 \(m\) 的余数。

我们看到向下取整的符号可以自然想到一个方法,我们有:

\[10^n=\lfloor\frac{10^n}{m}\rfloor\times m+r \]

我们设 \(\lfloor\frac{10^n}{m}\rfloor=k\),则有:

\[10^n=k\times m+r \]

\[k=k'\times m+r' \]

\(r'\)即为所求。

我们把 \(k\) 带入到第一个式子中,有:

\[10^n=(k'\times m+r')\times m+r \]

\[10^n=k'\times m^2+r'\times m+r \]

由余数的定义可得:

\[r'\times m+r\equiv k \ \ (\operatorname{mod} m^2) \]

\[\lfloor\frac{r'\times m+r}{m}\rfloor=r' \]

那么求解 \(r'\) 的方法就明了了。时间复杂度 \(O(\log m^2)\)

//Don't act like a loser.
//This code is written by huayucaiji
//You can only use the code for studying or finding mistakes
//Or,you'll be punished by Sakyamuni!!!
#include<bits/stdc++.h>
#define int long long
using namespace std;

int read() {
	char ch=getchar();
	int f=1,x=0;
	while(ch<'0'||ch>'9') {
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=x*10+ch-'0';
		ch=getchar();
	}
	return f*x;
}

int n,m;

int qpow(int x,int y) {
	int ret=1;
	while(y) {
		if(y&1) {
			ret=ret*x%(m*m);
		}
		x=x*x%(m*m);
		y>>=1;
	}
	return ret;
}

signed main() {
	cin>>n>>m;
	cout<<qpow(10,n)/m<<endl;
	return 0;
}

posted @ 2021-01-17 16:03  huayucaiji  阅读(129)  评论(0编辑  收藏  举报