传送门
最近开始增强生成函数。c++
学完级数后,感受生成函数就是将几个级数相乘,而后收敛成某个函数后进行化简,最后再用经常使用级数展开式或者广义二项式定理展开,获得新的级数,那么\(m\)次项的系数就是和为\(m\)的方案数。
对于这道题,由于有选择顺序的不一样,因此要用指数型生成函数。蓝,黄色的生成函数都是\(e^x\),红,绿色只能是偶数,那就是\(f(x)=\sum\limits_{n=0}^{\infty} \frac{(2n)!}{x^{2n}}=\frac{e^x+e^{-x}}{2}\).ide
将上述四个生成函数相乘,就是总方案数的生成函数\(F(x)\),函数
那么\(n\)次方项的系数就是\(\frac{4^n+2^{n+1}}{4n!}\),再乘以\(n!\)即答案。ui
#include<cstdio> using namespace std; typedef long long ll; const ll mod = 10007; ll quickpow(ll a, ll b) { ll ret = 1; for(; b; b >>= 1, a = a * a % mod) if(b & 1) ret = ret * a % mod; return ret; } int main() { int T; scanf("%d", &T); ll inv4 = quickpow(4, mod - 2); while(T--) { int n; scanf("%d", &n); printf("%lld\n", (quickpow(4, n) + quickpow(2, n + 1)) % mod * inv4 % mod); } return 0; }