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

Posted ygeloutingyu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu4651(广义五边形数 & 分割函数)相关的知识,希望对你有一定的参考价值。

题目链接: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

 








以上是关于hdu4651(广义五边形数 & 分割函数)的主要内容,如果未能解决你的问题,请参考以下文章

hdu 4651 Partition——拆分数与五边形定理

诡异的dp(凸多边形分割):catalan数

HDU 4565 So Easy! 广义斐波拉数 数论 (a+sqrt(b))^n%mod 模板

HDU - 6314 Matrix(广义容斥原理)

改革春风吹满地 HDU - 2036 计算几何-----利用叉积计算多边形的面积

五边形数和两个递归式