POJ 3734 :Blocks(指数型生成函数)

题目大意:有一排砖头要上色,有四种颜色,其中两种用的数量必须是偶数,另外两种不限制用的数量,四种颜色的都有无限量的存储,求涂色方案。


要解决的是排列问题
直接构造指数型生成函数: ( 1 + x 2 2 ! + x 4 4 ! + . . . . ) 2 ∗ ( 1 + x + x 2 2 ! + x 3 3 ! + . . ) 2 = ( e x + e − x 2 ) 2 ∗ e 2 x (1 + \frac{x ^ 2}{2!} + \frac{x ^ 4}{4!}+....)^2*(1 +x +\frac{x ^ 2}{2!} + \frac{x ^ 3}{3!} + ..)^2 = (\frac{e^x + e^{-x}}{2})^2 * e^{2x} (1+2!x2+4!x4+....)2(1+x+2!x2+3!x3+..)2=(2ex+ex)2e2x = e 4 x + 1 + 2 ∗ e 2 x 4 = 1 4 + 1 4 ∑ ( 4 n + 2 n + 1 ) ∗ x n n ! =\frac{e^{4x} + 1 + 2 * e^{2x}}{4}=\frac{1}{4} + \frac{1}{4}\sum(4^n+2^{n+1})*\frac{x^n}{n!} =4e4x+1+2e2x=41+41(4n+2n+1)n!xn
答案就是 4 n + 2 n + 1 4 \frac{4^n + 2^{n + 1}}{4} 44n+2n+1


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 10007;
ll fpow(ll a,ll b) {
 ll r = 1;
 while(b) {
  if(b & 1) r = r * a % mod;
  a = a * a % mod;
  b >>= 1;
 }
 return r;
}
int t,n;
int main() {
 scanf("%d",&t);
 ll inv = fpow(4,mod - 2);
 while(t--) {
  scanf("%d",&n);
  printf("%lld\n",(fpow(4,n) + fpow(2,n + 1)) % mod * inv % mod);
 }
 return 0;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值