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代码:
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; }
相关文章推荐
- NYOJ 676 小明的求助
- NYOJ 676 小明的求助
- NYOJ 题目676 小明的求助(快速幂)
- nyoj-676-小明的求助
- NYOJ-676小明的求助,快速幂求模,快速幂核心代码;
- NYOJ 676 小明的求助
- NYOJ 676 小明的求助
- NYOJ 676 小明的求助 二分幂
- nyoj_676_小明的求助_201312042142-2
- nyoj——676 小明的求助
- nyist 676 小明的求助
- nyoj 19 擅长排列的小明
- NYOJ 55 懒省事的小明
- NYOJ 53 不高兴的小明
- NYOJ 53 不高兴的小明
- nyoj-19-擅长排列的小明
- NYOJ55 懒省事的小明【multiset的用法】
- NYOJ19 擅长排列的小明 【深搜】
- NYOJ -55 懒省事的小明
- (NYoj 469)擅长排列的小明 II --简单地推规律,打表思想