hdu 4704 Sum

思路:对于给定的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\n",pow(2,(a+b-1)%phi));
30     }
31     return 0;
32 }
View Code

 

 

 

posted @ 2013-08-23 14:46  _随心所欲_  阅读(189)  评论(0编辑  收藏  举报