题目
思路
生成函数直接怼上去
我们先考虑选出这些字母,只有选的字母不同才视为不同方案
对于\(A\)和\(C\)
\(G(x)=\sum_{i=0}^{\infty}\frac{1}{(2i)!}x^{2i}\)
对于\(B\)和\(D\)
\(F(x)=\sum_{i=0}^{\infty}\frac{1}{i!}x^i\)
写出来之后,这两个的形式就是一个套路性的东西
\(G(x)=\frac{e^x+e^{-x}}{2}\\F(x)=e^x\)
将他们卷起来
\(\begin{aligned}H(x)&=G^2(x)F^2(x)\\&=(\frac{e^x+e^{-x}}{2})^2*e^{2x}\\&=\frac{e^{4x}+2e^{2x}+1}{4}\\&=\frac{\sum_{i=0}^{\infty}\frac{1}{i!}(4x)^i+2*\sum_{i=0}^{\infty}\frac{1}{i!}(2x)^i+1}{4}\end{aligned}\)
我们需要的只是\(x^n\)的系数,别忘了我们对生成函数的定义,还需要全排列一下
\(ans=n!\frac{\frac{4^n}{n!}+2*\frac{2^n}{n!}}{4}=\frac{4^n+2*2^n}{4}=4^{n-1}+2^{n-1}\)
代码
#include<iostream>
using namespace std;
const int mod=100;
int qkpow(int a,long long b)
{
if(b==0)
return 1;
if(b==1)
return a;
int t=qkpow(a,b/2);
t=(t*t)%mod;
if(b%2==1)
t=(t*a)%mod;
return t;
}
int t;
long long n;
int main()
{
ios::sync_with_stdio(false);
while(cin>>t)
{
if(!t)
break;
for(int i=1;i<=t;i++)
{
cin>>n;
cout<<"Case "<<i<<": "<<(qkpow(4,n-1)+qkpow(2,n-1))%mod<<'\n';
}
cout<<'\n';
}
return 0;
}