hdu 4704 Sum (组合+欧拉定理)

来源:互联网 发布:蓝月翅膀升阶数据 编辑:程序博客网 时间:2024/06/14 06:14

http://acm.hdu.edu.cn/showproblem.php?pid=4704

大意:给定N,设S(k)是由k个数字相加得到N的方案数,求解
分析:本题中两个数字的排列,如1、2 应该有2种——1、2; 2、1(一开始以为它们相同,算作一种,怎么也算不出来)
如此以来,容易分析,将数字n看作1+1+1……+1(n个)
那么 (组合思维,隔板看待)
于是,答案就是

原问题的答案就是 
我们发现,mod是一个素数,所以,借助欧拉定理 (或者费马小定理),得到

#include <cstdio>#include <cstring>#include <iostream>using namespace std;typedef long long LL;const int mod=1e9+7,N=1e5+10;char str[N];LL power(LL a,LL p){    LL ans=1;    while(p){        if(p&1) ans=ans*a%mod;    a=a*a%mod;    p>>=1;    }    return ans;}int main(){    while(~scanf("%s",str)){        int len=strlen(str);    LL ans=0;    for(int i=0;i<len;i++){       ans=(ans*10+str[i]-'0')%(mod-1);       }        ans=(ans-1+mod-1)%(mod-1);        printf("%lld\n",power(2LL,ans));    }    return 0;}






0 0
原创粉丝点击