思路:对于给定的n,s(i)即将n分解为i个数的组合数,也就是在n-1个位置插入i-1个板即C(n-1,i-1);
∑S=2^(n-1);
phi(1000000007)=1000000006;
对于n>=phi,有a^n%c=a^(n%phi(c)+phi(c))%c。
代码如下:
1 #include<cstdio> 2 #include<cstring> 3 #define ll __int64 4 #define mod 1000000007 5 #define phi 1000000006 6 char s[100002]; 7 ll pow(ll a,ll b) 8 { 9 ll ans=1; 10 while(b){ 11 if(b&1) ans=ans*a%mod; 12 b>>=1; 13 a=a*a%mod; 14 } 15 return ans; 16 } 17 int main() 18 { 19 int len,i; 20 ll a,b; 21 while(scanf("%s",s)!=EOF){ 22 len=strlen(s); 23 a=b=0; 24 for(i=0;i<len;i++){ 25 a=a*10+s[i]-'0'; 26 if(b==0&&a>=phi) b=phi; 27 a%=phi; 28 } 29 printf("%I64d ",pow(2,(a+b-1)%phi)); 30 } 31 return 0; 32 }