Sum
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 2396 Accepted Submission(s): 995
Problem Description

Sample Input
2
Sample Output
2Hint1. For N = 2, S(1) = S(2) = 1. 2. The input file consists of multiple test cases.
看题意看了大半天系列,给你一个数字n,把n拆分成1,2......n份,求所有的方案数,隔板法,先把n分成n个1,那么里面有n-1个空格,我们用隔板来划分这n-1个一,如果要2份,就在这n-1个空格里面放1个,也就是c(n-1,1),依次类推,从c(n-1,0)+......c(n-1,n-1),用二次项定理可得为2的n-1次方,但是n灰常的大,这里使用费马小定理来降幂取模,
费马小定理:如果(a,p)互质,那么a^(p-1)%p=1,根据这个我们可以得出 2^((n-1)%(p-1))%p;然后求出n对mod 的取模过后用快速幂就行了。
#include<stdio.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<queue>
#include<math.h>
using namespace std;
long long mod;
long long quick(long long x,long long m)
{
long long ans=1;
while(m>0)
{
if(m%2==1)
{
ans*=x;
ans%=mod;
}
x=x*x;
x%=mod;
m/=2;
}
return ans;
}
int main()
{
long long n;
char s[200000];
while(scanf("%s",s)!=EOF)
{
mod=1000000006;
n=0;
int len=strlen(s);
for(int i=0;i<len;i++)
{
n=n*10+s[i]-'0';
if(n>=mod)
n%=mod;
}
n--;
if(n<0)
n+=mod;
mod++;
printf("%lld\n",quick(2,n));
}
return 0;
}