题意:
s(k)为所有元素为正整数并且和为N的k阶向量的个数,求s(1)+s(2)+...s(N)的值。
大意:
可以明显的发现规律为2^(n-1)。对于大数我们可以通过费马小定理化为小于1E9+6的数,之后用快速幂求值。
这个代码乱写的,其实可以优化得更好,本来还准备用java的modpow来A结果卡了java的时间= =。
#include <iostream>
#include <string.h>
using namespace std;
long long powmod(long long a,long long i,long long n)
{
if(i==0)
return 1%n;
long long temp=powmod(a,i>>1,n);
temp=temp*temp%n;
if(i&1) temp=(long long)temp*a%n;
return temp;
}
long long exgcd(long long a,long long b,long long &x,long long &y)
{
if(b==0)
{
x=1;
y=0;
return a;
}
else
{
long long r=exgcd(b,a%b,y,x);
y-=x*(a/b);
return r;
}
}
int main()
{
char a[1000005];
long long x,y;
long long k=exgcd(2,1000000007,x,y);
while(cin>>a)
{
long long ans=0;
int l=strlen(a);
for(int i=0; i<l; i++)
ans+=((a[i]-'0')*powmod(10,l-i-1,1000000006))%1000000006;
ans=ans%1000000006;
//cout<<ans<<endl;
long long c=powmod(2,ans,1000000007);
//cout<<c<<endl;
c=(c*x)%1000000007;
if(c<0) c+=1000000007;
cout<<c<<endl;
}
return 0;;
}