nyoj676小明的求助
生活随笔
收集整理的這篇文章主要介紹了
nyoj676小明的求助
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目鏈接
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; }
與50位技術專家面對面20年技術見證,附贈技術全景圖
題目大意:給三個數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; }
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的nyoj676小明的求助的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Nacos,阿里开源,是真的香!!
- 下一篇: 领域驱动设计和业务建模的最佳实现模式