题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=4704
首先,这样的方法数就是c【N-1】【K-1】 就是可重复元素的组合数 ,然后求和后是2^N-1 计算mod 100000007 由于模是素数,由费马小定理,只需要计算N-1除以mod 的余数,然后计算余数的时候,据说BigInteger会超时,那就死算吧,把每一位是多少算出来。
注意要点: 1 虽然p【i】都是int 范围内的,但是在计算过程中可能溢出。 所以开long long
2 算快速幂时也可能存在类似问题,所以参数都设置成long long
#include<iostream>
#include<cmath>
#include<string>
#include<algorithm>
typedef long long inta;
using namespace std;
inta quick_mod(inta a,inta b,inta m)
{
inta ans=1;
a=a%m;
while(b)
{
if(b&1)ans=(ans*a)%m;
a=(a*a)%m;
b>>=1;
}
return ans;
}
long long p[100001];
int mod =1000000006;
int modp=1000000007;
void pre()
{
p[0]=1;
for(int i=1;i<=100000;i++)
p[i]=(p[i-1]*10)%mod;
}
int main()
{
pre();
string s;
while(cin>>s)
{
reverse(s.begin(),s.end());
inta tempans=0;
for(int i=0;i<s.length();i++)
tempans=(tempans+p[i]*(s[i]-'0'))%mod;
if(tempans==0) tempans=mod-1;
else tempans-=1;
cout<<quick_mod(2,tempans,modp)<<endl;
}
}