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

浙公网安备 33010602011771号