生成函数+组合数学--bzoj3028: 食物

传送门

可以把这些限制都列成生成函数:
1 + x 2 + x 4 + . . . = 1 1 − x 2 1+x^2+x^4+...=\frac{1}{1-x^2} 1+x2+x4+...=1x21
1 + x 1+x 1+x
1 + x + x 2 = 1 − x 3 1 − x 1+x+x^2=\frac{1-x^3}{1-x} 1+x+x2=1x1x3
x + x 3 + x 5 + . . . = x 1 − x 2 x+x^3+x^5+...=\frac{x}{1-x^2} x+x3+x5+...=1x2x
1 + x 4 + x 8 + . . . = 1 1 − x 4 1+x^4+x^8+...=\frac{1}{1-x^4} 1+x4+x8+...=1x41
1 + x + x 2 + x 3 = 1 − x 4 1 − x 1+x+x^2+x^3=\frac{1-x^4}{1-x} 1+x+x2+x3=1x1x4
1 + x 3 + x 6 + . . . = 1 1 − x 3 1+x^3+x^6+...=\frac{1}{1-x^3} 1+x3+x6+...=1x31
将所有式子相乘得到的多项式的 x n x^n xn的系数就是答案
相乘得到: x ( 1 − x ) 4 = x × ( 1 + x + x 2 + . . . ) 4 \frac{x}{(1-x)^4}=x\times (1+x+x^2+...)^4 (1x)4x=x×(1+x+x2+...)4
因为不想推公式,可以用组合数学的思想, x n x^n xn的系数就相当于把 n − 1 n-1 n1拆分成四个有序整数的方案数,就可以用隔板法 C n + m − 1 m − 1 C_{n+m-1}^{m-1} Cn+m1m1得到答案为 C n + 2 3 C_{n+2}^3 Cn+23

也就是 n × ( n + 1 ) × ( n + 2 ) 6 \frac{n\times(n+1)\times(n+2)}{6} 6n×(n+1)×(n+2),输入 n n n的时候边输入边取模就好了

放上优秀 0 m s 0ms 0ms 代码:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define LL long long
using namespace std;
const int mod=10007;

inline int rd(){
	int x=0,f=1;char c=getchar();
	while(c<'0' || c>'9') f=c=='-'?-1:1,c=getchar();
	while(c<='9' && c>='0') x=(x*10+c-'0')%mod,c=getchar();
	return x*f;
}

inline int qpow(int x,int k){
	int ret=1;
	while(k){
		if(k&1) ret=ret*x%mod;
		x=x*x%mod; k>>=1;
	} return ret;
}

int main(){
	int n=rd();
	printf("%lld\n",1LL*n*(n+1)%mod*(n+2)%mod*qpow(6,mod-2)%mod);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值