2018.12.30 poj3734 Blocks(生成函数)

版权声明:随意转载哦......但还是请注明出处吧: https://blog.csdn.net/dreaming__ldx/article/details/85405426

传送门
生成函数入门题。


按照题意构造函数:
对于限定必须是出现偶数次的颜色: 1 + x 2 2 ! + x 4 4 ! + . . . = e x + e x 2 1+\frac {x^2}{2!}+\frac {x^4}{4!}+...=\frac{e^x+e^{-x}}2
对于无限定的颜色: 1 + x 1 ! + x 2 2 ! + . . . = e x 1+\frac x{1!}+\frac{x^2}{2!}+...=e^x
因此最终的生成函数 S E T ( x ) = e 2 x ( e x + e x 2 ) 2 = e 4 x + 2 e 2 x + 1 4 SET(x)=e^{2x}*(\frac{e^x+e^{-x}}2)^2=\frac{e^{4x}+2e^{2x}+1}4
而我们要求的就是 x i x^i 的系数。
根据泰勒展开式:
e k x e^{kx} 的展开式中 x n x^n 对应的系数是 k n k ! \frac{k^n}{k!}
因此出现的方案数为 4 n + 2 n + 1 4 n ! \frac{4^n+2^{n+1}}{4n!}
由于每种方案有 n ! n! 种排列方式,因此最终答案就是 4 n + 2 n + 1 4 \frac{4^n+2^{n+1}}4
代码:

#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;
}

猜你喜欢

转载自blog.csdn.net/dreaming__ldx/article/details/85405426