POJ - 3734 Blocks 指数型生成函数
题意:有红球,蓝球,绿球,黄球,其中红球和绿球都只能选择偶数个,求选择 $n$ 个球摆成一排有多少种方案数.
我们构造关于这些球的指数型生成函数 $F(x)=\sum_{i=0}^{\infty} \frac{a_{i}}{i!}x^i$ 其中 $a_{i}$ 表示选择 $i$ 个球的不同排列数.
红与绿:$1+\frac{x^2}{2!}+\frac{x^4}{4!}+.....=\frac{e^x+e^{-x}}{2}$
黄与蓝:$1+\frac{x}{1!}+\frac{x^2}{2!}+......=e^x$
那么 G+R+Y+B $=(\frac{e^x+e^{-x}}{2})^2(e^{x})^2$
把这个再展开,然后我们发现第 $n$ 项系数为 $\frac{4^n+2^{n+1}}{n!}$,故答案为 $4^n+2^{n+1}$
#include <cstdio> #include <algorithm> #define mod 10007 #define ll long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; int qpow(int x,int y) { int tmp=1; for(;y;y>>=1,x=(ll)x*x%mod) if(y&1) tmp=(ll)tmp*x%mod; return tmp; } int INV(int x) { return qpow(x,mod-2); } int main() { // setIO("input"); int i,j,T,inv4=INV(4); scanf("%d",&T); while(T--) { int n; scanf("%d",&n); printf("%d\n",(ll)inv4*(ll)(qpow(4,n)+qpow(2,n+1))%mod); } return 0; }