【hdu 4658】Integer Partition (无序分拆数、五边形数定理)
题意
n分拆成若干个正整数的和,每个正整数出现小于k次,分拆方案有多少。(t<=100,n<=1e5)
题解
之前写过一篇Partition Numbers的计算,后面补充了hdu 4651的做法。就是利用五边形数定理。
这题加强了限制条件。
n的无序分拆数的生成函数:
\(\sum_{i=1}^{\infty}B(i)x^i=(1+x+x^2+..)(1+x^2+x^4+..)…=\frac {1}{\prod_{i=1}^{\infty}(1-x^i)}\)
由五边形数定理知
\(\prod_{n=1}^{\infty}(1-x^n)=\sum_{k=0}^\infty (-1)^k x^{\frac {k(3k\pm 1)}{2}}\)
故\((1+B(1)x+B(2)x^2+..)(1-x-x^2+x^5+x^7+..)=1\)。
比较两边\(x^n\)系数,得到
\(B(n)-B(n-1)-B(n-2)+B(n-5)+B(n-7)+..=0\)
所以可以\(O(n^{1.5})\)计算出B。
有了限制,生成函数变成
\(g(x)=(1+x+x^2+..+x^{k-1})(1+x^2+x^4+..+x^{2(k-1)})…= {\prod_{i=1}^\infty(1-x^{ik})}B(x)\)
再利用五边形数定理得
\(g(x)=(1-x^k-x^{2k}+x^{5k}+..)(1+B(1)x+B(2)x^2+B(3)x^3+..)\)
\(x^n\)的系数即为答案。
代码
int n,k;
int B[N]={1,1,2};
int main() {
int t;
sf(t);
for(int i=3;i<N;++i)
for(int j=1,f=1;f;++j)
for(int k=-1;k<2;k+=2){
int w=(3*j*j+k*j)/2;
if(w>i){f=0;break;}
if(j%2)B[i]=(B[i]+B[i-w])%mod;
else B[i]=(B[i]-B[i-w]+mod)%mod;
}
while(t--){
sf(n);sf(k);
int ans=0;
ans=B[n]%mod;
for(int i=1,f=1;f;++i)
for(int j=-1;j<2&&f;j+=2){
int w=(3*i*i+j*i)/2;
if(w*k>n){f=0;break;}
if(i%2==0)ans=(ans+B[n-w*k])%mod;
else ans=(ans-B[n-w*k]+mod)%mod;
}
printf("%d\n",ans);
}
return 0;
}
【hdu 4658】Integer Partition (无序分拆数、五边形数定理)的更多相关文章
- hdu 4651 Partition && hdu 4658 Integer Partition——拆分数与五边形定理
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4651 参考:https://blog.csdn.net/u013007900/article/detail ...
- HDU 4658 Integer Partition (2013多校6 1004题)
Integer Partition Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others ...
- HDU 4658 Integer Partition(整数拆分)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4658 题意:给出n.k.求n的拆分方案数.要求拆分中每个数不超过k. i64 f[N]; void i ...
- hdu 4658 Integer Partition
五角数定理!!可以参考这个http://www.cnblogs.com/xin-hua/p/3242428.html 代码如下: #include<iostream> #include& ...
- hdu 4651 Partition(整数拆分+五边形数)
Partition Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- hdu4651(广义五边形数 & 分割函数1)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:f(x) 为将 x 分成其他数和的形式的方案数.对于 t 组输入,输出 f(xi). 思路 ...
- HDU 1068 Girls and Boys(最大独立集合 = 顶点数 - 最大匹配数)
HDU 1068 :题目链接 题意:一些男孩和女孩,给出一些人物关系,然后问能找到最多有多少个人都互不认识. 转换一下:就是大家都不认识的人,即最大独立集合 #include <iostream ...
- HDU 4160 Dolls (最小路径覆盖=顶点数-最大匹配数)
Dolls Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...
- [HDU 3625]Examining the Rooms (第一类斯特林数)
[HDU 3625]Examining the Rooms (第一类斯特林数) 题面 有n个房间,每个房间有一个钥匙,钥匙等概率的出现在n个房间内,每个房间中只会出现且仅出现一个钥匙.你能炸开门k次, ...
随机推荐
- SDN 实验室学生们
SDN实验室系列:https://edu.cnblogs.com/campus/fzu/SdnLab --研究生及本科生们的博客及GitHub链接.欢迎各位大佬招募. 研究生 2018级 姓名 博客地 ...
- Daily Scrum 12.19
Member Task on 12.19 Task on 12.20 仇栋民 请假 完成Task972 : 完成活动评分基础功能 康家华 完成 Task1004 : 百度map UI优化 完成Task ...
- shell脚本--eval执行shell命令
和其他语言的eval功能差不多,都是将一个保存执行语句的变量作为参数,eval会让变量所保存的语句执行. 下面是一个执行表单提交的命令:注意,这里只是示例,应用中不要这么使用,很危险 #!/bin/b ...
- redis 运维手册
redis cli命令 - milkty - 博客园https://www.cnblogs.com/kongzhongqijing/p/6867960.html Redis多个数据库 - EasonJ ...
- vmware can not be closed virtual machine is busy
VMware does not close when Windows Server 2003 ... |VMware Communities https://communities.vmware.co ...
- Java Map 集合实现类
Map 用于保存具有映射关系的数据,集合里会保存两组值,一组用于保存Map里的key,一组用于保存Map里的value,key与map可以是任何引用类型数据.Map的key不允许重复.key与valu ...
- Java Serializable的使用和transient关键字使用小记(转载)
一:Serializable 1.持久化的简单介绍: “持久化”意味着对象的“生存时间”并不取决于程序是否正在执行——它存在或“生存”于程序的每一次调用之间.通过序列化一个对象,将其写入磁盘,以后在程 ...
- java核心API学习
1:java.lang (Object.String.StringBuffer.Thread.System.ClassLoader.Class.Runtime.包装类等)
- Linux 下面 PG 的 uuid-ossp 包安装办法
1. pgsql 安装 时报错, 如图示: 详细信息为: 执行SQL为: CREATE EXTENSION IF NOT EXISTS "uuid-ossp" 错误纤细信息为: C ...
- SAP配置BOM的适用范围
配置BOM中定义属性,单纯的编码要搞死人: 适合小批量周期短多品种