码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-09-26 23:32:50      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:--   str   http   names   iostream   closed   pid   mod   ace   

题目链接: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(广义五边形数 & 分割函数)

标签:--   str   http   names   iostream   closed   pid   mod   ace   

原文地址:http://www.cnblogs.com/geloutingyu/p/7599415.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!