poj3734 Blocks [指数型生成函数]

本文介绍了一种利用生成函数解决特定排列问题的方法,具体为计算在一定条件下对地砖进行染色的方案数量。通过定义不同颜色的生成函数并结合泰勒展开公式,最终得出解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description:
一列nn块地砖,可以染成红黄蓝绿四种颜色之一,并且要求黄绿数量为偶数,问方案数。


Solution:
排列问题并且每种元素内部没有顺序,利用指数型生成函数解决。
分别设四种颜色的生成函数为A,B,C,D
A(x)=C(x)=i=1xii!
B(x)=D(x)=i=1x2i(2i)!B(x)=D(x)=∑i=1∞x2i(2i)!
根据泰勒展开
i=1xii!=ex∑i=1∞xii!=ex
i=1xii!=ex∑i=1∞x−ii!=e−x
得出
A(x)=C(x)=exA(x)=C(x)=ex
B(x)=D(x)=ex+ex2B(x)=D(x)=ex+e−x2
所以方案数即为
A(x)B(x)C(x)D(x)=e4x+2e2x+14A(x)B(x)C(x)D(x)=e4x+2e2x+14
常数项忽略不计
因为
ekxnknk!ekx的第n项系数为knk!
所以带回得出
=4n+22n4n!=4n+2∗2n4n!
乘上阶乘得出答案为
4n+22n44n+2∗2n4


#include <cstdio>
using namespace std;
typedef long long ll;
const int P = 10007;
ll n;
ll power(ll x, ll t) {
    ll ret = 1;
    for(; t; t >>= 1, x = x * x % P) {
        if(t & 1) {
            ret = ret * x % P;
        }
    }
    return ret;
}
int main() {
    int T;
    scanf("%d", &T);
    while(T--) {
        scanf("%lld", &n);
        printf("%lld\n", (power(4, n) + 2 * power(2, n)) % P * power(4, P - 2) % P);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值