費馬小定理+快速冪:ACM-ICPC 2018 焦作賽區網路預賽 G. Give Candies
阿新 • • 發佈:2018-12-10
限制時間是1S,試了試Java的大數運算,超時了。發現雖然 N 的值大的可怕但結果是取餘後的,可以通過費馬小定理減小指數大小後快速冪得到結果。
快速冪運算時必須加上取餘, (a * b) % p = (a % p * b % p) % p !
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MOD 1000000007 long long FastPowOf2(long long num) { long long sp=1,base=2; while(num) { if(num&1) sp=(sp%MOD*base)%MOD; base=(base*base)%MOD; num>>=1; } return sp; } int main(int agrc,char **argv) { char *BigArray=(char*)malloc(sizeof(int)*100005); int cnt; scanf("%d",&cnt); while(cnt--) { scanf("%s",BigArray); int i; long long sum; for(i=0,sum=0;i<strlen(BigArray);i++) sum=(sum*10+BigArray[i]-'0')%(MOD-1); printf("%lld\n",FastPowOf2(sum-1)); } return EXIT_SUCCESS; }
END