Sum HDU 4704(數論+費馬小定理+找規律)
阿新 • • 發佈:2018-12-14
分類:數論+費馬小定理+找規律
題意:給出N,s(k)=num(x1,x2,x3...,xk).s(k)==將N分成k組得數量。給出N問(s(1)+s(2)....s(N))%mod得值。
思路:看懂題意手動模擬算以下前面幾個= =
N=1 s(1)=1 ans=1;
N=2 s(1)=1 s(2)=1 ans=2;
N=3 s(1)=1 s(2)=2 s(3)=1 ans=4;
N=4 s(1)=1 s(2)=3 s(3)=3 s(4)=1 ans=8;
......好吧答案應該就是2^(n-1)%mod.(不行得的話大家也可以打表試試),或者手動在擼一遍N=5,6,7
根據題意n得值真的是非常大。
看過費馬小定理的就知道這個肯定要用費馬小定理了:如果n和mod互質,a^n%mod==a^(n%(mod-1))%mod
所以處理以下輸入的資料,字串轉整數順便取模。
#include<iostream> #include<cstdio> using namespace std; typedef long long ll; const ll mod=1e9+7; ll quick_pow(ll a,ll n) { ll ans=1; while(n) { if(n&1) { ans*=a; ans%=mod; } a*=a; a%=mod; n>>=1; } return ans; } int main() { ll a,b; string s; while(cin>>s) { ll sum=0; int len=s.size(); for(int i=0;i<len;i++) { sum=(sum*10+s[i]-'0')%(mod-1); } sum=(sum-1+mod-1)%(mod-1); ll ans=quick_pow(2,sum); printf("%lld\n",ans%mod); } return 0; }