传送门
文章目录
- 题意:
- 思路:
题意:
一段长度为nnn的序列,你有红黄蓝绿四种颜色的砖块,问你铺砖的方案数,每块砖长度为111,其中红黄颜色个数必须为偶数。
思路:
考虑多重集合排列数:
所以我们构造四种颜色的指数生成函数,并转换成封闭式:
f红(x)=f黄(x)=1+x22!+x44!+...=ex+e−x2f_{红}(x)=f_{黄}(x)=1+\frac{x^2}{2!}+\frac{x^4}{4!}+...=\frac{e^x+e^{-x}}{2}f红(x)=f黄(x)=1+2!x2+4!x4+...=2ex+e−x
f蓝(x)=f绿(x)=1+x1!+x22!+...=exf_{蓝}(x)=f_{绿}(x)=1+\frac{x}{1!}+\frac{x^2}{2!}+...=e^xf蓝(x)=f绿(x)=1+1!x+2!x2+...=ex
将其乘起来得封闭式
G=e2x∗e2x+e−2x+24=e4x+2e2x+14G=e^{2x}*\frac{e^{2x}+e^{-2x}+2}{4}=\frac{e^{4x}+2e^{2x}+1}{4}G=e2x∗4e2x+e−2x+2=4e4x+2e2x+1。
再将封闭式展开
由ex=∑i≥0xii!e^x=\sum_{i\ge0}\frac{x^i}{i!}ex=∑i≥0i!xi,得ekx=∑i≥0kixii!e^{kx}=\sum_{i\ge0}\frac{k^ix^i}{i!}ekx=∑i≥0i!kixi,即G=14+∑i≥0(4i+2i+1)∗xii!4G=\frac{1}{4}+\frac{\sum_{i\ge0}(4^i+2^{i+1})*\frac{x^i}{i!}}{4}G=41+4∑i≥0(4i+2i+1)∗i!xi,取指数为nnn的项,得系数4n+2n+14∗n!\frac{4^n+2^{n+1}}{4*n!}4∗n!4n+2n+1,可以将常数项忽略,再乘上多重集合排列数的分子n!n!n!得4n+2n+14=4n−1+2n−1\frac{4^n+2^{n+1}}{4}=4^{n-1}+2^{n-1}44n+2n+1=4n−1+2n−1,答案即为4n−1+2n−14^{n-1}+2^{n-1}4n−1+2n−1,快速幂直接算一下即可。
// Problem: Blocks
// Contest: Virtual Judge - POJ
// URL: https://vjudge.net/problem/POJ-3734
// Memory Limit: 65 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#include<cassert>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=10007,INF=0x3f3f3f3f;
const double eps=1e-6;LL qmi(LL a,LL b) {LL ans=1;while(b) {if(b&1) ans=ans*a%mod;b>>=1;a=a*a%mod;}return ans%mod;
}int main()
{
// ios::sync_with_stdio(false);
// cin.tie(0); int _; cin>>_;while(_--) {int n; cin>>n;cout<<((1ll*qmi(4,n-1)+qmi(2,n-1))%mod)<<endl;}return 0;
}
/**/