您的位置:首页 > 其它

HDU--4704 Sum【费马小定理,快速幂】

2015-02-15 11:50 567 查看

Sum

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)

Total Submission(s): 1642 Accepted Submission(s): 698



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.



/*
题意:
给定一个数n 将其分解,Si 表示将n拆成i个数的方案数
求sum( si ) 1<=i<=n;
分析:
隔板原理, n个木棍,n-1个缝,
分成1份则是C(n-1,0);
分成2份则是C(n-1,1);
分成3份则是C(n-1,2);
...
分成n份则是C(n-1,n-1);
ans = sum( C(n-1,i) ) (0<=i<=n-1)
=2^(n-1);
由于要取模 而且 2 与 mod 互质 ,因此可以用费马小定理来降幂
根据费马小定理:(2,MOD)互质,则2^(p-1)%p=1,于是我们可以转化为:
2^(n-1)%MOD=2^((n-1)%(MOD-1))%MOD,从而用快速幂求解。
*/

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MOD 1000000007

char str[100010];
long long pow(long long n){
    long long a=1,b=2;
    while(n){
        if(n&1){
            a=a*b%MOD;
        }
        n>>=1;
        b=b*b%MOD;
    }
    return a;
}

int main(){
    while(scanf("%s",str)!=EOF){
        int len=strlen(str);
        long long n=0;
        for(int i=0;i<len;i++)
            n=(n*10+str[i]-'0')%(MOD-1);//注意
        printf("%I64d\n",pow(n-1));
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: