您的位置:首页 > 其它

nyoj676小明的求助

2017-01-18 20:12 246 查看
题目链接

http://acm.nyist.net/JudgeOnline/problem.php?pid=676
题目大意:给三个数N(1~10^10),P(1~10^15),M(1~9) ,求N的P次方的后M位数字。

思路:后M位数实际上就是%(pow(10,M))。

我令M=pow(10,M) 则N^2%M=(N%M*N%M)%M,这个公式可推广到N^P,这样做是为了防止数据太大而溢出产生错误。

N%M要循环P(max P = 10^15)次,是铁定超时的,所以用到快速求幂的知识。

AC代码:

#include <stdio.h>
#include <math.h>
int main() {
int t, i;
scanf("%d", &t);
for(i = 1; i <= t; i++) {
long long N, P, M, T = 1;
scanf("%lld%lld%lld", &N, &P, &M);
M = ceil(pow(10.0,M+0.0));
while(P>1) {//快数求幂法
N %= M;//防止数据太大N*N时产生溢出
if(P&1) {//当P为奇数时的处理
T *= N;
T %= M;//防止溢出
}
N *= N;//N = N*N
P >>= 1;//P = P/2
}
printf("Case #%d: %lld\n", i, ((N%M)*(T%M))%M);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: