链接: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;
}