习题:"红色病毒"问题 (生成函数)

题目

传送门

思路

生成函数直接怼上去

我们先考虑选出这些字母,只有选的字母不同才视为不同方案

对于\(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;
}

猜你喜欢

转载自www.cnblogs.com/loney-s/p/12107380.html