本贴不适宜大佬食用
题目来源:ARC111A
题目大意
给出 n n n和 m m m,求 ⌊ 1 0 n m ⌋ % m \lfloor{\frac{10^n}{m}}\rfloor \% m ⌊m10n⌋%m的值。
1 ≤ n ≤ 1 0 18 1\leq n\leq 10^{18} 1≤n≤1018, 1 ≤ m ≤ 1 0 4 1\leq m\leq10^4 1≤m≤104
分析
这题需要用到模运算的一个性质:
n m % p = n % ( m × p ) m \frac n m \% p=\frac{n\% (m\times p)}{m} mn%p=mn%(m×p)
证明:
n m % p = n m − k × p = n m − k × p × m m = n − k × p × m m = n % ( m × p ) m \frac{n}{m}\%p\\ =\frac{n}{m}-k\times p\\ =\frac{n}{m}-\frac{k\times p\times m}{m}\\ =\frac{n-k\times p\times m}{m}\\ =\frac{n\%(m\times p)}{m} mn%p=mn−k×p=mn−mk×p×m=mn−k×p×m=mn%(m×p)
套入本题,得
⌊ 1 0 n m ⌋ % m = ⌊ 1 0 n % m 2 m ⌋ \lfloor{\frac{10^n}{m}}\rfloor\% m=\lfloor\frac{10^n\% {m^2}}{m}\rfloor ⌊m10n⌋%m=⌊m10n%m2⌋
用快速幂求出 1 0 n % m 2 10^n\% {m^2} 10n%m2再整除 m m m即可。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n, m;
LL ksm(LL x, LL y) {
LL sum = 1, tmp = 10;
while (x) {
if (x & 1)
(sum *= tmp) %= y;
x >>= 1, (tmp *= tmp) %= y;
}
return sum;
}
int main() {
scanf("%lld%lld", &n, &m);
printf("%.lf", floor(ksm(n, m * m) * 1.0 / m));
return 0;
}