HDU4704:Sum(費馬小定理 & 隔板法)
阿新 • • 發佈:2019-01-27
Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2767 Accepted Submission(s): 1155
Problem Description
Sample Input 2
Sample Output 2 Hint 1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases.
Source 思路:S(K)相當於把N分成K部分的種數,就是C(N-1, K-1),S(1)+...+S(N)就是2^(N-1),由於N很大不能直接快速冪,根據費馬小定理a^(p-1)=1modp,將N-1分成若干個p-1+餘數k,就是2^k%mod就搞定了。
# include <iostream> # include <cstdio> # include <cstring> typedef long long LL; const int maxn = 1e5+10; const LL mod = 1e9+7; char s[maxn]; LL cal() { LL ans = 0; for(int i=0; s[i]; ++i) ans = (ans*10+s[i]-'0')%(mod-1); return ans; } LL qmod(LL a, LL b) { LL ans=1, pow=a; for(;b;b>>=1) { if(b&1) ans = ans*pow%mod; pow = pow*pow%mod; } return ans; } int main() { while(~scanf("%s",s)) { LL pow = (cal()+mod-2)%(mod-1); printf("%lld\n",qmod(2,pow)); } return 0; }