2018.12.30 poj3734 Blocks(生成函数)

传送门

生成函数入门题。


按照题意构造函数:

对于限定必须是出现偶数次的颜色:1+x22!+x44!+...=ex+e−x21+\frac {x^2}{2!}+\frac {x^4}{4!}+...=\frac{e^x+e^{-x}}21+2!x2​+4!x4​+...=2ex+e−x​

对于无限定的颜色:1+x1!+x22!+...=ex1+\frac x{1!}+\frac{x^2}{2!}+...=e^x1+1!x​+2!x2​+...=ex

因此最终的生成函数SET(x)=e2x∗(ex+e−x2)2=e4x+2e2x+14SET(x)=e^{2x}*(\frac{e^x+e^{-x}}2)^2=\frac{e^{4x}+2e^{2x}+1}4SET(x)=e2x∗(2ex+e−x​)2=4e4x+2e2x+1​

而我们要求的就是xix^ixi的系数。

根据泰勒展开式:

ekxe^{kx}ekx的展开式中xnx^nxn对应的系数是knk!\frac{k^n}{k!}k!kn​

因此出现的方案数为4n+2n+14n!\frac{4^n+2^{n+1}}{4n!}4n!4n+2n+1​

由于每种方案有n!n!n!种排列方式,因此最终答案就是4n+2n+14\frac{4^n+2^{n+1}}444n+2n+1​

代码:

#include<iostream>
#include<cstdio>
using namespace std;
const int mod=10007;
int T,n;
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=a*a%mod)if(p&1)ret=ret*a%mod;return ret;}
int main(){
	scanf("%d",&T);
	while(T--)scanf("%d",&n),cout<<((ksm(2,n+1)+ksm(4,n))%mod)*2502%mod<<'\n';
	return 0;
}
上一篇:PL/SQL程序设计、流程控制


下一篇:poj3734 Blocks