1. 分拆数定义
正整数 的一个分拆是将
表示为若干正整数的无序和。分拆数
表示
的不同分拆方式的数量。
示例:
,因为
的分拆为:
2. 生成函数
分拆数的生成函数由欧拉给出:
其中 。
3. 递推公式(五边形数定理)
欧拉的五边形数定理导出递推关系:
求和对所有非零整数 (正负)进行,且当
时
。
注: 是广义五边形数。
4. 渐近公式(Hardy-Ramanujan)
当 时,分拆数满足:
5. 限制部分的分拆数
若要求分拆中每个部分不超过 ,其生成函数为:
6. 共轭分拆与Ferrers图
每个分拆对应一个Ferrers图,共轭分拆通过交换行和列得到。
示例:分拆 的共轭为
。
7. 其他变体
-
奇分拆:所有部分为奇数,生成函数:
-
不同部分分拆:各部分互不相同,生成函数:
例题
P6189 [NOI Online #1 入门组] 跑步 - 洛谷
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
int p[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
int n,mod;
cin>>n>>mod;
p[0]=p[1]=1;
for(int i=2;i<=n;i++){
int k=1;
while(1){
int tmp=0;
if((3*k*k+k)/2<=i) tmp=p[i-(3*k*k+k)/2]%mod;
if((3*k*k-k)/2<=i) tmp=(tmp+p[i-(3*k*k-k)/2]%mod)%mod;
if((3*k*k-k)/2>i) break;
if(k&1) p[i]+=tmp%mod;
else p[i]+=(mod-tmp%mod)%mod;
p[i]=(p[i]%mod+mod)%mod;
k++;
}
//cout<<p[i]<<'\n';
}
cout<<p[n]<<'\n';
return 0;
}