hdu 4704 同余定理+普通快速幂
此题往后推几步就可找到规律,从1开始,答案分别是1,2,4,8,16....
这样就可以知道,题目的目的是求2^n%Mod的结果.....此时想,应该会想到快速幂...然后接着会发现,由于n的值过大,很容易就会T掉...
所以这个时候就想到找规律...试试就可以知道,1e9+6的时候是循环节...
然后用同余定理,把余数求出来就可以了...
#include<iostream> #include<string> #include<string.h> #include<cstdio> #include<algorithm> using namespace std; #define Mod 1000000007 __int64 quick_pow(__int64 m,__int64 n) { __int64 ans=1; while(n){ if(n&1) ans=(ans*m)%Mod; n=n>>1; m=(m*m)%Mod; } return ans; } int main() { __int64 N, i, num, len; char str[1000010]; while(~scanf("%s", str)){ num = 0; len = strlen(str); for(i = 0; i != len; ++i) //同余定理 { num = (num * 10 + (int)(str[i] - '0')) % 1000000006; } __int64 ans; if(num==0){ printf("%I64d\n",quick_pow(2,Mod-2)); } else{ num--; ans=quick_pow(2,num); printf("%I64d\n",ans); } } return 0; }