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

  

posted @ 2020-01-14 15:13  EM-LGH  阅读(114)  评论(0编辑  收藏  举报