hdu4651(广义五边形数 & 分割函数1)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651

 

题意:f(x) 为将 x 分成其他数和的形式的方案数.对于 t 组输入,输出 f(xi).

 

思路:直接套公式即可.

1、广义五边形数
qn 为 (3*n*n-n)/2 和 (3*n*n+n)/2
q1 = 1, 2
q2 = 5, 7
q3 = 12, 15
...
2、分割函数
p(n) = sigma(-1)^(i-1)p(n-qi) (qi <= n) //这里的 qi 对应前面的两个数

 

代码:

 1 #include <iostream>
 2 using namespace std;
 3 
 4 const int mod = 1e9 + 7;
 5 const int MAXN = 1e5 + 1;
 6 int f[MAXN];
 7 
 8 void get_f(void){
 9     f[0] = 1;
10     for(int i = 1; i < MAXN; i++){
11         for(int j = 1, cnt = 1; i - (3 * j * j - j) / 2 >= 0; j++, cnt *= -1){
12             int cc = 3 * j * j;
13             f[i] += f[i - (cc - j) / 2] * cnt;
14             f[i] %= mod;
15             f[i] = (f[i] + mod) % mod;
16             if(i >= (cc + j) / 2){
17                 f[i] += f[i - (cc + j) / 2] * cnt;
18                 f[i] %= mod;
19                 f[i] = (f[i] + mod) % mod;
20             }
21         }
22     }
23 }
24 
25 int main(void){
26     get_f();
27     int t, x;
28     cin >> t;
29     while(t--){
30         cin >> x;
31         cout << f[x] << endl;
32     }
33     return 0;
34 }
View Code

 

posted @ 2017-09-26 22:40  geloutingyu  阅读(663)  评论(0编辑  收藏  举报