整数拆分的可能数

题目:给定一个整数 n ,输出这个整数拆分的可能总数。

例如:n=6 时有

6=5+1=4+2=4+1+1=3+3=3+2+1=2+2+2=2+2+1+1=2+1+1+1=1+1+1+1+1+1

11 种分解方法,所以输出应该为 11

使用母函数法:

整数分解用母函数可以这样理解,分别用任意个 1,2,3,4,,n 可以加起来可以表示成 n 的种数。又因为当使用整数 mn 进行分解时,所使用的次数不能多于 n/m 次,所以可以写下母函数如下:

G(x)(1+x1+x2++xn)×(1+x2+x4++xn22)××(1+xm+x2m+x3m++xnmm)××(1+xn)

在程序中使用 s 数组表示每一轮乘法后得到系数,c 数组表示到现在为止乘法得到的系数总和。最后算出结果后 xn 对应的系数则为可分解的可能数。

代码如下:

#include<cstdio>
const int num=405;
long long s[num];
long long c[num];

int main() {
	int n;
	while(scanf("%d",&n)!=EOF) {
		for(int i=0; i<num; i++) {
			c[i]=1;
			s[i]=0;
		}
		for(int i=2; i<=n; i++) {
			for(int j=0; j<=n; j+=i) {
				for(int k=0; j+k<=n; k++) {
					s[k+j]+=c[k];
				}
			}
			for(int x=0; x<=n; x++) {
				c[x]=s[x];
				s[x]=0;
			}
		}
		printf("%lld\n",c[n]);
	}
	return 0;
}

posted on   White_Fang  阅读(24)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示