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 }

时间: 2024-08-09 07:12:57

hdu4651(广义五边形数 & 分割函数)的相关文章

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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4658 题意:f(x) 为将 x 分成其他数和的形式的方案数.对于 t 组输入,输出 f(xi, k), 其中 k 表示 xi 分解的数出现的次数不超过 k 次. 思路:在 hdu4651(http://www.cnblogs.com/geloutingyu/p/7599415.html) 的基础上加个限制 k. 感觉公式好难推,直接当模板用好了. 代码: 1 #include <iostream>

五边形数定理

五边形数定理 转自<维基百科> http://zh.wikipedia.org/wiki/五邊形數定理 五边形数定理是一个由欧拉发现的数学定理,描述欧拉函数展开式的特性[1] [2].欧拉函数的展开式如下: 亦即 欧拉函数展开后,有些次方项被消去,只留下次方项为1, 2, 5, 7, 12, ...的项次,留下来的次方恰为广义五边形数. 若将上式视为幂级数,其收敛半径为1,不过若只是当作形式幂级数(formal power series)来考虑,就不会考虑其收敛半径. 和分割函数的关系 欧拉函

五边形数和两个递归式

五边形数 五边形数是对每条边上有 \(n\) 个点构成的五边形的总点数的数列的称呼. 由上图,可以得出这个数列的递归式. \[ \begin{aligned} a_1&=1 \a_n&=a_{n-1}+(3n-2) \\end{aligned} \] 解递归式得到通项公式 \[ \begin{aligned} a_n&=\sum _{i=1}^n(3i-2)=\frac{n(3n-1)}{2} \end{aligned} \] 它也能通过三个三角形数得到. 狭义的五边形数中 \(n

字符串分割函数--拆分成多行(转)

--字符串拆分成行 declare @str varchar(8000)  set @str = 'a1,b1,c2,d1,e3,f5'  --,换成 union all select set @str = 'select  name='''+replace(@str,',',''' union all select ''')+''''  exec(@str) /*name  ----  a1 b1 c2 d1 e3 f5 */ --字符串分割函数--拆分成多行 create function

实现按行读取文件,把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出。

/* 2 编写一个业务函数,实现按行读取文件.把内容按照第三种内存模型打包数据传出,把行数通过函数参数传出. 函数原型有两个,任意选择其一 要求1:请自己任意选择一个接口(函数),并实现功能:70分 要求2:编写测试用例.30分 要求3:自己编写内存释放函数 */ /********************************************************************** * 版权所有 (C)2015, Wu Yingqiang. * * 文件名称:ReadFi

php 字符串分割函数split

说明 array split    ( string $pattern   , string $string   [, int $limit  ] ) 本函数返回一个字符串数组,每个单元为   string 经区分大小写的正则表达式   pattern 作为边界分割出的子串.如果设定了   limit,则返回的数组最多包含   limit 个单元,而其中最后一个单元包含了   string 中剩余的所有部分.如果出错,则   split() 返回 FALSE. Example #1 split(

oracle | 字符串分割函数

/** * 字符串分割函数. * @param P_STR 待分割的字符串 * @param 分隔符 * @return 自定义table类型TY_STR_SPLIT. * 使用方法 select column_value from table(fn_split('1,2',',')) * @Author: xDer */ CREATE OR REPLACE FUNCTION FN_SPLIT(P_STR IN VARCHAR2, P_DELIMITER IN VARCHAR2) RETURN

JavaScript中字符串分割函数split用法实例

这篇文章主要介绍了JavaScript中字符串分割函数split用法,实例分析了javascript中split函数操作字符串的技巧,非常具有实用价值,需要的朋友可以参考下 本文实例讲述了JavaScript中字符串分割函数split用法.分享给大家供大家参考.具体如下: 先来看下面这段代码: <script type="text/javascript"> var str="How are you doing today?" document.write

C语言利用va_list、va_start、va_end、va_arg宏定义可变參数的函数

在定义可变參数的函数之前,先来理解一下函数參数的传递原理: 1.函数參数是以栈这样的数据结构来存取的,在函数參数列表中,从右至左依次入栈. 2.參数的内存存放格式:參数的内存地址存放在内存的堆栈段中,在运行函数的时候,从最后一个(最右边)參数開始入栈.因此栈底高地址,栈顶低地址,举个样例说明一下: void test(int a, float b, char c); 那么,在调用test函数的时候,实參char c先进栈,然后是float b,最后才是int a,因此在内存中变量的存放次序是c-