HDOJ 4704 Sum

来源:互联网 发布:顶级域名的两大类 编辑:程序博客网 时间:2024/06/05 16:07

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
2
Hint
1. 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;}



0 0
原创粉丝点击