HDU 5136 Yue Fei's Battle DP计数+分类讨论?分治?

转载: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 }
原文地址:https://www.cnblogs.com/HITLJR/p/6601529.html