链接:http://hdu.hustoj.com/showproblem.php?pid=4704
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.
题意S(i)表示用i个数组成n有几种情况。只要顺序不一样就好。
求 S(1)+S(2)+...+S(n)%1000000007;
假设:An=S(1)+S(2)+...S(n)。
讨论A(n+1)的情况。划分出一个数位1,2,3,,,,n,则A(n+1)=A(1)+A(2)+....A(n)。
A(n+1)=A(1)+A(2)+....A(n)
A(n)=A(1)+A(2)+....A(n-1)。
两式一减得到A(n+1)-A(n)=A(n)。
2*A(n)=A(n+1)。
A(1)=1;
A(n)=2^(n-1);
答案就是2^(n-1)%1000000007;
A^X%M=A^(X%(M-1))%M。 A,M互质。
最后就是快速幂了。
#include<cstdio> #include<cmath> #include<iostream> #include<string> #include<cstring> using namespace std; typedef long long ll; const ll mod=1e9+7; ll qu(ll n){ ll ans=1,a=2; while(n){ if(n%2) ans=ans*a%mod; a=a*a%mod; n/=2; } return ans; } int main(){ char s[100005]; while(~scanf("%s",s)){ ll sum=0; for(int i=0;s[i]!='\0';i++){ sum=(sum*10+s[i]-'0')%(mod-1); } sum=(sum+mod-2)%(mod-1); printf("%lld\n",qu(sum)); } return 0; }