BZOJ3028 母函数入门

Posted Stump

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了BZOJ3028 母函数入门相关的知识,希望对你有一定的参考价值。

BZOJ3027

http://www.lydsy.com/JudgeOnline/problem.php?id=3027

显而易见

母函数是这坨玩意

 所以总数不超过b的方案,对于这一坨

 我们暴力枚举一个kxy

那么它对ans的贡献为

 

复杂度O(2n*n) 

#include<cstdio>
#define FOR(i,s,t) for(register int i=s;i<=t;++i)
typedef long long ll;
int mul;
const int mod=2004;
int n,a,b;
int m[12];
inline int getC(int n,int m){
	if(n<m)return 0;
	ll Mod=1ll*mul*mod,ans=1ll;
	for(register int i=n-m+1;i<=n;++i)ans=1ll*ans%Mod*i%Mod;
	return (ans/mul)%mod; 
}
inline int dfs(int dep,int k,int y,int lim){
	return (dep==n+1?(mod+k*getC(n+lim-y,n)%mod):(dfs(dep+1,-k,y+m[dep]+1,lim)+dfs(dep+1,k,y,lim)))%mod;
}
int main(){
	scanf("%d%d%d",&n,&a,&b);
	mul=1;FOR(i,1,n)mul*=i,scanf("%d",m+i);
	printf("%d\\n",(dfs(1,1,0,b)-dfs(1,1,0,a-1)+mod)%mod);
	return 0;
} 

  

BZOJ3028

http://www.lydsy.com/JudgeOnline/problem.php?id=3028

(1).

(2).

(3).

(4).

(5).

(6).

(7).

(8).

 

把(1)~(8)乘起来得到 

因此,

#include<cstdio>
char c;
const int mod=10007;
inline int fp(int a,int b){
	int ret=1;
	while(b){
		if(b&1)ret=ret*a%mod;
		b>>=1;
		a=a*a%mod; 
	}
	return ret;
}
int data;
int main(){
	while(c=getchar(),c<=\'9\'&&c>=\'0\')data=(data<<1)+(data<<3)+c-48,data%=mod;
	printf("%lld",1ll*data*(data+1)%mod*(data+2)%mod*fp(6,mod-2)%mod);
    return 0;  
}

  

 

以上是关于BZOJ3028 母函数入门的主要内容,如果未能解决你的问题,请参考以下文章

bzoj3028 食物 生成函数+隔板法

BZOJ 3028 3028: 食物 (生成函数)

bzoj 3028 食物——生成函数

BZOJ 3028 食物 ——生成函数

BZOJ 3028: 食物 [生成函数 隔板法 | 广义二项式定理]

[BZOJ 3028]食物(生成函数)