HDU 4651 (生成函数)】的更多相关文章

HDU 4651 Partition Problem : n的整数划分方案数.(n <= 100008) Solution : 参考资料: 五角数 欧拉函数 五边形数定理 整数划分 一份详细的题解 欧拉函数的定义如下: \[\phi(q) =\prod\limits_{n=1}^{\infty}(1-q^n) \] 五边形定理对欧拉函数展开如下: \[\phi(q) = \sum_{n = 0}^{n = \infty}(-1)^nq^{\frac{3n^2\pm n}{2}}\] 其中 \(\…
下面内容摘自维基百科: 五边形数定理[编辑] 五边形数定理是一个由欧拉发现的数学定理,描写叙述欧拉函数展开式的特性[1] [2].欧拉函数的展开式例如以下: 亦即 欧拉函数展开后,有些次方项被消去,仅仅留下次方项为1, 2, 5, 7, 12, ...的项次,留下来的次方恰为广义五边形数. 当中符号为- - + + - - + + ..... 若将上式视为幂级数,其收敛半径为1,只是若仅仅是当作形式幂级数(formal power series)来考虑,就不会考虑其收敛半径. 和切割函数的关系…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:给出n.求其整数拆分的方案数. i64 f[N]; void init(){    f[0]=f[1]=1; f[2]=2;    int i,j,k,t;    for(i=3;i<N;i++) for(j=1;;j++)    {        FOR0(k,2)        {            if(!k) t=(3*j*j-j)/2;            else t=…
题意:把一个整数N(1 <= N <= 100000)拆分不超过N的正整数相加,有多少种拆法. 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 ——>>好经典的问题,但数好大,比赛卡住了... 原来,这个问题有个公式计算: q[i]为第i个广义五边形数. #include <cstdio> using namespace std; const int maxn = 100000; const int mod = 1…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4651 参考:https://blog.csdn.net/u013007900/article/details/42365823 https://blog.csdn.net/visit_world/article/details/52734860 好像这样复杂度就是 \( O(n\sqrt{n} \) 的了. #include<cstdio> #include<cstring> #inclu…
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1028 就是可以用任意个1.2.3....,所以式子写出来就是这样:(1+x+x^2+...)(1+x^2+x^4+...)(1+x^3+x^6+...)...(1+x^n+x^(2*n)+...)... 因为求 x^n 系数,所以再往后的式子就没有贡献了,求到第 n 个式子即可. 一个x^2就像一条边一样,可以让第 k 项的系数转移给第 k+2 项.按这个思路写代码就行了. #include<iostr…
题意:给n种房子,每种房子有一个值val和个数cnt,现在要把这些房子分成两部分,争取两部分总值相等,如果不能相等,让A>B,且A-B最小. 解法:先跑一次生成函数,c[n]表示组成总值为n的方法种数,然后从Total/2~0枚举B的总值,如果c[i]不为0,说明可以达到 i 这个状态,说明这就是B的最接近A的值(因为最接近Total/2).算法复杂度较高.跑了1600多ms,不知道还有没有更优的算法. 代码: #include <iostream> #include <cstdi…
主题链接:http://acm.hdu.edu.cn/showproblem.php?pid=2082 找单词 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4035    Accepted Submission(s): 2887 Problem Description 如果有x1个字母A. x2个字母B,..... x26个字母Z,…
HDU - 1028 step 1:初始化第一个多项式 也就是 由 1的各种方案 组 成 的多项式 初始化系数为 1.临时区 temp初始化 为 0 step 2:遍历后续的n - 1 个 多项式 ,第二重 for  j  代 表 的 存 储 结 果 的 多 项 式的次数,k 代表 当前 第 i 的 多项式的次数 通过计算发现两个多项式相乘 其中一个 系数为1和 0 组成,运算时可以初始化系数数组为0 ,然后 由另一个的系数 与之相加即可得到 G(x)=(1+x+x2+x3+x4+.....)(…
按套路列生成函数式子然后暴力乘,这样复杂度看起来非常大,但是可以动态维护最大值,这样就是O(能过)的了 仔细想想这个多项式暴力乘理解成背包dp也行? #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int N=300005; int n,m,a[N],b[N],v[N],w[N]; int main() { while(scanf("%d"…