hdu1028 Ignatius and the Princess III 生成函数

题目链接:传送门

Problem Description
“Well, it seems the first problem is too easy. I will let you know how foolish you are later.” feng5166 says.

“The second problem is, given an positive integer N, we define an equation like this:
N=a[1]+a[2]+a[3]+…+a[m];
a[i]>0,1<=m<=N;
My question is how many different equations you can find for a given N.
For example, assume N is 4, we can find:
4 = 4;
4 = 3 + 1;
4 = 2 + 2;
4 = 2 + 1 + 1;
4 = 1 + 1 + 1 + 1;
so the result is 5 when N is 4. Note that “4 = 3 + 1” and “4 = 1 + 3” is the same in this problem. Now, you do it!”

Input
The input contains several test cases. Each test case contains a positive integer N(1<=N<=120) which is mentioned above. The input is terminated by the end of file.

Output
For each test case, you have to output a line contains an integer P which indicate the different equations you have found.

生成函数
首先把每个位置的生成函数写成 1 + x + x 2 + . . . + x n 1+x+x^2+...+x^n 1+x+x2+...+xn是布星的qwq,因为不考虑顺序。
不考虑顺序就想到把1有多少个,2有多少个(以此类推)写成生成函数,即
F ( n ) = ( 1 + x + x 2 + . . . + x n ) ( 1 + x 2 + x 4 + . . . + x 2 n ) . . . ( 1 + x n + . . . ) F(n)=(1+x+x^2+...+x^n)(1+x^2+x^4+...+x^{2n})...(1+x^n+...) F(n)=(1+x+x2+...+xn)(1+x2+x4+...+x2n)...(1+xn+...)
这样保证不管每个数取几个,系数都是1,即保证了每种取法只算一次qwq。
因为答案是 x n x^n xn的系数,所以不考虑指数 > n >n >n的情况,大莉跑dp即珂。

毒瘤代码

#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<vector>
#define re register int
#define mod 2004
using namespace std;
typedef long long ll;
int read() {
	re x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9') {
		if(ch=='-')	f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9') {
		x=(x<<1)+(x<<3)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
inline void write(const int x) {
	if(x>9)	write(x/10);
	putchar(x%10+'0');
}
const int Size=205;
const int INF=0x3f3f3f3f;
int n,dp[Size][Size];
int main() {
	while(scanf("%d",&n)==1) {
		memset(dp,0,sizeof(dp));
		dp[0][0]=1;
		for(re i=1; i<=n; i++) {
			for(re j=0; j<=n; j++) {
				for(re k=0; j+k<=n; k+=i) {
					dp[i][j+k]+=dp[i-1][j];
				}
			}
		}
		printf("%d\n",dp[n][n]);
	}
	return 0;
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值