hdu 4704 sum 大整數取模+費馬小定理+數快速冪
阿新 • • 發佈:2019-02-15
求輸入的n可以有幾種拆分情況:
如:
2-->(2,11)2種
3-->(3,21,12,111)4種
4-->(4,31,13,22,211,112,121,1111)8種
發現規律 結果 = 2^(n-1),再取模得到要求的即為 2^(n-1)%mod
由於所給的n很大,10^100000,(10^3=1000......)
所以用字串讀入,
先用費馬小定理2^n % p = 2^[ n % (p-1) ] % p降冪:
將2^(n-1)%mod轉化為2^[(n-1)%(mod-1)%]mod,就是先將冪部分取一次模,用到大數取模
(大數減一取模,可以先用大數取模得sum,所得結果再-1)
然後轉化為可以用快速冪求解的2^(sum-1)%mod
#include <iostream> #include <cstring> #define ll long long const ll mod = 1e9+7; using namespace std; ll qpow(ll a, ll b, ll c) { ll ans = 1; a = a % c; while(b) { if(b&1) ans = ans * a%c; b>>=1; a= a*a %c; } return ans; } int main() { ll ans,sum; char c[100005]; while(cin>>c) { sum=0; int len = strlen(c); for(int i=0;i<len;i++) sum=(sum*10+c[i]-'0')%(mod-1); ans=qpow(2,sum-1,mod); cout<<ans<<endl; } return 0; }