题目描述
题目大意:有A,B,C,D四种字母,问组成长度为N的字符串的方案数,其中A,C只能选偶数个(可不选,N<2^64)。
题解
指数型生成函数果果题。
不知道是谁说的:组合用常生成函数,排列用指数生成函数。
根据肥肥图的博客,答案就是
4n−1+2n−1
,快速幂一下。
将每个字母取法的生成函数相乘,得到一堆:
而
ex
的泰勒展开是
ex=∑+∞i=0xii!
,
e−x
就是
e−x=∑+∞i=0(−1)ixii!
,
所以
F(x)=e2x(ex+e−x2)2=e4x+2e2x+14
。
到这里直接求
n
阶导就得到第
也可以直接强拆,第
n
项
又到了感性理解其正确性的时候了:对于取
n
个的排列方案,在考虑数量的前提下,乘上了在
换种形式表述的话,常生成函数就是在搞 Cnm=∑ni=0CiL∗Cn−im−L ,而指数生成函数就是在搞 Anm=∑ni=0Cin∗AiL∗An−im−L 。
所以这两种看似很神奇的生成函数,其本质也是基于排列组合。
代码
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#define MOD 100
using namespace std;
typedef unsigned long long ULL;
int T;
ULL N;
int Pow(int x, ULL y){
int res = 1;
for(; y; x = x * x % MOD, y >>= 1)
if(y & 1) res = res * x % MOD;
return res;
}
int main(){
while(~ scanf("%d", &T) && T){
for(int i = 1; i <= T; i++){
scanf("%llu", &N);
printf("Case %d: %d\n", i, (Pow(4, N-1) + Pow(2, N-1)) % MOD);
}
puts("");
}
return 0;
}