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

 

 

 

你可能感兴趣的:(HDU)