【题解】简单的数学题-题解

本贴不适宜大佬食用

题目来源: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} 1n1018 1 ≤ m ≤ 1 0 4 1\leq m\leq10^4 1m104

分析

这题需要用到模运算的一个性质:

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=mnk×p=mnmk×p×m=mnk×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;
}

END

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值