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;
}