Simple Maths 2
如题目所说,这是一道简单数学题。
题目的意思就是求 ⌊ 1 0 n m ⌋ \lfloor\frac{10^n}{m}\rfloor ⌊m10n⌋ 除以 m m m 的余数。
我们看到向下取整的符号可以自然想到一个方法,我们有:
1 0 n = ⌊ 1 0 n m ⌋ × m + r 10^n=\lfloor\frac{10^n}{m}\rfloor\times m+r 10n=⌊m10n⌋×m+r
我们设 ⌊ 1 0 n m ⌋ = k \lfloor\frac{10^n}{m}\rfloor=k ⌊m10n⌋=k,则有:
1
0
n
=
k
×
m
+
r
10^n=k\times m+r
10n=k×m+r
k
=
k
′
×
m
+
r
′
k=k'\times m+r'
k=k′×m+r′
r ′ r' r′即为所求。
我们把 k k k 带入到第一个式子中,有:
1
0
n
=
(
k
′
×
m
+
r
′
)
×
m
+
r
10^n=(k'\times m+r')\times m+r
10n=(k′×m+r′)×m+r
1
0
n
=
k
′
×
m
2
+
r
′
×
m
+
r
10^n=k'\times m^2+r'\times m+r
10n=k′×m2+r′×m+r
由余数的定义可得:
r
′
×
m
+
r
≡
k
(
mod
m
2
)
r'\times m+r\equiv k \ \ (\operatorname{mod} m^2)
r′×m+r≡k (modm2)
⌊
r
′
×
m
+
r
m
⌋
=
r
′
\lfloor\frac{r'\times m+r}{m}\rfloor=r'
⌊mr′×m+r⌋=r′
那么求解 r ′ r' r′ 的方法就明了了。时间复杂度 O ( log m 2 ) O(\log m^2) O(logm2)
//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;
}