1. 程式人生 > >hdu4651(廣義五邊形數 & 分割函數)

hdu4651(廣義五邊形數 & 分割函數)

main amp for splay 分割 view const -- names

題目鏈接: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(廣義五邊形數 & 分割函數)