欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

POJ - 3734 Blocks 指数生成函数

发布时间:2023/12/4 编程问答 41 豆豆
生活随笔 收集整理的这篇文章主要介绍了 POJ - 3734 Blocks 指数生成函数 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

传送门

文章目录

  • 题意:
  • 思路:

题意:

一段长度为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+ex
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=e2x4e2x+e2x+2=4e4x+2e2x+1
再将封闭式展开
ex=∑i≥0xii!e^x=\sum_{i\ge0}\frac{x^i}{i!}ex=i0i!xi,得ekx=∑i≥0kixii!e^{kx}=\sum_{i\ge0}\frac{k^ix^i}{i!}ekx=i0i!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+4i0(4i+2i+1)i!xi,取指数为nnn的项,得系数4n+2n+14∗n!\frac{4^n+2^{n+1}}{4*n!}4n!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=4n1+2n1,答案即为4n−1+2n−14^{n-1}+2^{n-1}4n1+2n1,快速幂直接算一下即可。

// 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; } /**/

总结

以上是生活随笔为你收集整理的POJ - 3734 Blocks 指数生成函数的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。