知识点 - 分拆数/整数拆分

解决问题类型:

将一个数用一个或多个正整数的无序和来表示有几种方案。

这是一个母函数的应用,利用了母函数的指数系数是五边形数来优化复杂度。

结论

(1)称正整数n分解为r个正整数和的个数为n分解成r的分拆数,记为Pr(n)P_{r}\left( n \right)Pr​(n)

(2)P1(n)P_{1}\left( n \right)P1​(n)=1;Pn(n)P_{n}\left( n \right)Pn​(n)=1;Pn−1(n)P_{n - 1}\left( n \right)Pn−1​(n)=1;Pn−2(n)P_{n - 2}\left( n \right)Pn−2​(n)=2;Pn−3(n)P_{n - 3}\left( n \right)Pn−3​(n)=3

(3)P2(n)=⌈n−12⌉,n≥2P_{2}\left( n \right) = \left\lceil \frac{n - 1}{2} \right\rceil,n \geq 2P2​(n)=⌈2n−1​⌉,n≥2

(4)Pr(n)=P1(n−r)+P2(n−r)+⋅⋅⋅+Pr(n−r)P_{r}\left( n \right) = P_{1}\left( n - r \right) + P_{2}\left( n - r \right) + \cdot \cdot \cdot + P_{r}\left( n - r \right)Pr​(n)=P1​(n−r)+P2​(n−r)+⋅⋅⋅+Pr​(n−r)

性质

  1. ·n的分拆数中最大部分为m的个数=把n分拆成m部分的个数
  2. ·n的分拆数中每一部分都小于等于m的个数=把n分成m份或更小
  3. ·n的分拆数中每部分的数都相等的个数=n 的因子个数
  4. ·n的分拆数中每部分都是1或2(或者把n分拆成1或2部分)的个数=floor(n/2+1)=floor(n/2+1)=floor(n/2+1);
  5. ·n的分拆数中每部分都是1或2或3(或者把n分拆成1或2或3部分)的个数=(n+3)2/12=(n+3)^2/12=(n+3)2/12;

维基百科翻译

复杂度:

O(nn)O(n\sqrt{n})O(nn​)?

例题

将一个正整数N拆成不少于一个数的和,问有多少种方案 :

若令划分函数P(n)为答案,则有
P(n)=Σ(−1)(i−1)P(n−qi)(qi&lt;=n)P(n) = \Sigma(-1)^{(i-1)}P(n-q_i) (q_i &lt;= n) P(n)=Σ(−1)(i−1)P(n−qi​)(qi​<=n)
​ 其中q为五边形数:
qi=3i(i−1)/2q_i=3i(i-1)/2 qi​=3i(i−1)/2
证明(母函数):

将一个正整数N拆成不少于一个数的和,且每个数的出现次数不超过K次

exd:

BZOJ4772 显而易见的数论
Σ划分方案pΣiΣj&gt;ig(aF(pi,pj)modk)\Sigma _{划分方案p}\Sigma_i\Sigma_{j&gt;i}g(a_F(p_i,p_j)modk) Σ划分方案p​Σi​Σj>i​g(aF​(pi​,pj​)modk)

代码

//T1, https://www.cnblogs.com/geloutingyu/p/7599415.html
#include <iostream>
using namespace std;const int mod = 1e9 + 7;
const int MAXN = 1e5 + 1;
int f[MAXN];void get_f(void){f[0] = 1;for(int i = 1; i < MAXN; i++){for(int j = 1, cnt = 1; i - (3 * j * j - j) / 2 >= 0; j++, cnt *= -1){int cc = 3 * j * j;f[i] += f[i - (cc - j) / 2] * cnt;f[i] %= mod;f[i] = (f[i] + mod) % mod;if(i >= (cc + j) / 2){f[i] += f[i - (cc + j) / 2] * cnt;f[i] %= mod;f[i] = (f[i] + mod) % mod;}}}
}int main(void){get_f();int t, x;cin >> t;while(t--){cin >> x;cout << f[x] << endl;}return 0;
}
//T2 T1基础上加个限制 k
// https://www.cnblogs.com/geloutingyu/p/7603378.html
#include <iostream>
#include <stdio.h>
using namespace std;const int mod = 1e9 + 7;
const int MAXN = 1e5 + 1;
int f[MAXN];void get_f(void){f[0] = 1;for(int i = 1; i < MAXN; i++){for(int j = 1, cnt = 1; i - (3 * j * j - j) / 2 >= 0; j++, cnt *= -1){int cc = 3 * j * j;f[i] += f[i - (cc - j) / 2] * cnt;f[i] %= mod;f[i] = (f[i] + mod) % mod;if(i >= (cc + j) / 2){f[i] += f[i - (cc + j) / 2] * cnt;f[i] %= mod;f[i] = (f[i] + mod) % mod;}}}
}int solve(int n, int k){int ans = f[n];for(int i = 1, cnt = -1; n - k * (3 * i * i - i) / 2 >= 0; i++, cnt *= -1){ans += f[n - k * (3 * i * i - i) / 2] * cnt;ans %= mod;ans = (ans + mod) % mod;if(n - k * (3 * i * i + i) / 2 >= 0){ans += f[n - k * (3 * i * i + i) / 2] * cnt;ans %= mod;ans = (ans + mod) % mod;}}return ans;
}int main(void){get_f();int t, x, k;scanf("%d", &t);while(t--){scanf("%d%d", &x, &k);printf("%d\n", solve(x, k));}return 0;
}

知识点 - 分拆数/整数拆分相关推荐

  1. [Note] 多项式全家桶 小球与盒子 分拆数

    - Partition NumberReference p r ( n ) p_r(n) pr​(n) 表示将正整数 n n n 拆分为若干个不大于 r r r 的正整数的和的方案数(无序). 1.你 ...

  2. 高等组合学笔记(十): 分拆数恒等式, 分拆函数同余性质

    分拆数恒等式 定理6 : Gauss分拆恒等式 1(x:q)∞=∑n≥0xn(q:q)n.\frac1{(x:q)_\infty}=\sum_{n\geq0}\frac{x^n}{(q:q)_n.} ...

  3. LOJ #6268 分拆数

    不会五边形数的菜鸡的分块乱搞 LOJ #6268 题意 求前$ n$个数的整数划分方案数,$ n \leq 10^5$ $ Solution$ 考虑暴力$ DP$ $ f(x,y)$表示放了$ x$个 ...

  4. 高等组合学笔记(八):第一类Stirling数, 整数分拆

    第一类Stirling数的递推关系式 定理A: s(n,k)=s(n−1,k−1)−(n−1)s(n−1,k),(n,k≥1),s(n,0)=s(0,k)=0,(n,k≥1),s(0,0)=1s(n, ...

  5. 15拆分成3个不同的自然数_小学二年级奥数训练题之分拆

    做奥数题有助于我们能力的提升,不仅在数学方面,其他方面也是很有帮助的,主要是让我们多动脑思考.下面为大家带来小学二年级奥数训练题. 小学二年级奥数训练题 整数分拆问题是一个古老而又十分有趣的问题.所谓 ...

  6. 高等组合学笔记(九): 球盒模型的十二模式,分拆的生成函数

    球盒模型的十二模式 n球⟶fk盒n球\stackrel{f}{\longrightarrow}k盒 n球⟶f​k盒 nnn球 kkk盒 fff单 fff满 fff不加限制 不同 不同 ① ② ③ 相同 ...

  7. 高等组合学笔记(十一):分拆与Gauss二项式系数,恒等式与展开式

    分拆与Gauss二项式系数 定义: Pl(n∣⩽m)P_l(n|\leqslant m)Pl​(n∣⩽m): nnn的lll部分拆, 且每部分⩽m\leqslant m⩽m的分拆数; Pl(n∣⩽m) ...

  8. 15拆分成3个不同的自然数_三年级常考的奥数题:整数拆分问题

    三年级常考的奥数题:整数拆分问题 导语:书,我的良师益友,它给我知识.力量,它指导我怎样去生活和斗争.下面是小编为大家整理的,数学练习题,希望对大家有所帮助,欢迎阅读,仅供参考,更多相关的知识,请关注 ...

  9. hdu 2098 分拆素数和(一个偶数拆分成两个不同素数和 拆法数量)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=2098 分拆素数和 Time Limit: 1000/1000 MS (Java/Others)     ...

最新文章

  1. [MATLAB调试笔记]Possion方程求网格点电场强度
  2. iis只能访问html页面,win2003 IIS6,能访问html页 但是不能访问aspx页解决办法汇总
  3. 为什么手机版scp进不去_SCP1471,只属于你一人你的异常狗子,scp基金会系列
  4. 移动端实现hover效果
  5. Teradata Fastload 使用方法
  6. 论文浅尝 - IJCAI2020 | KGNN:基于知识图谱的图神经网络预测药物与药物相互作用...
  7. 图网络笔记-知识补充与node2vec代码注解
  8. word文字中的数字怎么自动变化_【天华学术】不会为毕业论文“美颜”,怎么办?...
  9. visual studio 删除附加项
  10. C#中水晶按钮的程序生成【转载】
  11. 电信烽火2821t虚拟服务器设置,iTV使用指南-烽火智能高清机顶盒装维手册
  12. 蓝牙怎么调声音大小_蓝牙耳机怎么调音量?
  13. 两台计算机如何打印机共享打印机,两台计算机如何共享一个打印机?
  14. STM32工具使用---STVP烧录工具
  15. 用jQuery合并表格中相同文本的相邻单元格
  16. 国王游戏——c++实现
  17. ,进门安卓手机首选 三星盖世S5670评测
  18. PS_BaseUse_白底照片
  19. 七牛云 图片上传覆盖
  20. PS2018学习笔记(19-24节)

热门文章

  1. Jaeger开发入门(java版)
  2. MintUI 组件和Mui
  3. 计算机专业英语BD,计算机专业英语
  4. 全新MXone Pro自适应苹果CMSV10影视模板/亲测
  5. 鸿蒙系统研究之六:U-Boot引导
  6. Android开发中几种布局方式介绍
  7. 打爆李世石第一步:使用神经网络设计人工智能围棋机器人
  8. python实现类似于visio_5款替代微软Visio的开源免费软件
  9. 如何建设IDC数据中心机房?看完你就明白了!
  10. Android图片海报制作-自定义文字排版控件组件