转载:http://blog.csdn.net/xiefubao/article/details/41709957
1 #include <iostream> 2 3 using namespace std; 4 const long long mod = 1000000007; 5 const long long inv2 = (mod+1) / 2; 6 const long long inv3 = (mod+1) / 3; 7 long long dp[50055]; 8 long long sum[50055]; 9 void init() 10 { 11 dp[0] = 1; 12 dp[1] = 1; 13 dp[2] = 2; 14 sum[0] = 1; 15 sum[1] = 2; 16 sum[2] = 4; 17 for (int i = 3; i<=50050; i++) 18 { 19 dp[i] = (( dp[i-1] * sum[i-2] % mod ) + (dp[i - 1] + ((dp[i-1] * (dp[i-1]-1) % mod )* inv2 % mod)) % mod ) % mod; 20 //i-1 和 不到i-1 两个相同i-1 两个不同i-1 21 sum[i]=(sum [i-1] + dp[i] )% mod; 22 } 23 } 24 int main() 25 { 26 init(); 27 int n; 28 long long ans = 0LL; 29 while (cin>>n&&n) 30 { 31 32 if (n%2 == 0) 33 { 34 ans = ((dp[n/2] * (dp[n/2] - 1+mod) % mod )*inv2 % mod + dp[n/2] ) % mod; 35 } 36 else 37 { 38 ans = ((( (dp[n/2] * (dp[n/2]-1+mod) % mod) * (dp[n/2]-2+mod) % mod ) *inv3) % mod ) * inv2 % mod; // 三个不相同 39 ans = (ans + dp[n/2] ) % mod;// 三个完全相同 40 ans =( ans + (dp[n/2] * ( dp[n/2] - 1 ) % mod ) % mod ) % mod; //二个相同 41 ans = (ans + ((dp[n/2] + ((dp[n/2] * (dp[n/2]-1+mod) % mod ) * inv2 % mod )) % mod ) * (sum[n/2-1]) % mod ) % mod;//一个不足 42 } 43 cout << ans <<endl; 44 } 45 }