传送门


题解:

完全自己推出来的第一道数学神题。

首先我们知道宽度为222的部分方案数是斐波那契数列。

设fnf_nfn​表示长度为nnn的时候方案数,题目要求的实际上是这个东西:

∑n=lr(fnk)\sum_{n=l}^r{f_n\choose k}n=l∑r​(kfn​​)

看上去非常地不可做,考虑表示成下降幂的形式,然后利用第一类斯特林数直接转成自然幂,直接上通项公式,然后利用二项式定理展开,后面就是一个等比数列求和:

∑n=lr(fnk)=∑n=lrfnk‾k!=1k!∑n=lrsk,i(−1)k−i∑n=lr(Ax1n+Bx2n)i=1k!∑n=lrsk,i(−1)k−i∑j=0i(ij)AjBi−j∑n=lr(x1jx2i−j)n\begin{aligned} &\sum_{n=l}^r{f_n\choose k}\\ =&\sum_{n=l}^r\frac{f_n^{\underline{k}}}{k!}\\ =&\frac{1}{k!}\sum_{n=l}^rs_{k,i}(-1)^{k-i}\sum_{n=l}^r(Ax_1^n+Bx_2^n)^i\\ =&\frac{1}{k!}\sum_{n=l}^rs_{k,i}(-1)^{k-i}\sum_{j=0}^i{i\choose j}A^jB^{i-j}\sum_{n=l}^{r}(x_1^jx_2^{i-j})^n \end{aligned} ===​n=l∑r​(kfn​​)n=l∑r​k!fnk​​​k!1​n=l∑r​sk,i​(−1)k−in=l∑r​(Ax1n​+Bx2n​)ik!1​n=l∑r​sk,i​(−1)k−ij=0∑i​(ji​)AjBi−jn=l∑r​(x1j​x2i−j​)n​

由于kkk很小,直接做就行了。

所以现在的问题就是求通项公式。

宽度为222的情况已经玩烂了,就是斐波那契数列。

考虑333的情况,显然长度为奇数的情况方案为000,设gng_ngn​表示长度为2n2n2n的时候的方案数。定义一个块不可分割当且仅当我们无法竖着切一刀且不切到任何一张牌。

注意到宽度为333的时候,任意偶数长度的不可切割块都存在,长度为222的有333种构造方式,长度更长的有222种构造方式。

我们有初始条件g0=1,g1=3g_0=1,g_1=3g0​=1,g1​=3,以及递推关系:

gn=3⋅gn−1+2⋅∑i=0n−2gig_n=3\cdot g_{n-1}+2\cdot \sum_{i=0}^{n-2}g_ign​=3⋅gn−1​+2⋅i=0∑n−2​gi​

写出gn−1g_{n-1}gn−1​的表达式,差分得到gn=4gn−1−gn−2g_n=4g_{n-1}-g_{n-2}gn​=4gn−1​−gn−2​

这个形式非常简洁,直接解特征方程可以得到gn=3+36(2+3)n+3−36(2−3)ng_n=\frac{3+\sqrt 3}{6}(2+\sqrt 3)^n+\frac{3-\sqrt 3}{6}(2-\sqrt 3)^ngn​=63+3​​(2+3​)n+63−3​​(2−3​)n


代码(两个namespace 是直接复制粘贴的):

#include<bits/stdc++.h>
#define ll long long
#define re register
#define cs constusing std::cerr;
using std::cout;cs int mod=998244353;
inline int add(int a,int b){a+=b-mod;return a+(a>>31&mod);}
inline int dec(int a,int b){a-=b;return a+(a>>31&mod);}
inline int mul(int a,int b){ll r=(ll)a*b;return r>=mod?r%mod:r;}
inline int power(int a,int b,int res=1){for(;b;b>>=1,a=mul(a,a))(b&1)&&(res=mul(res,a));return res;
}
inline void Inc(int &a,int b){a+=b-mod;a+=a>>31&mod;}
inline void Dec(int &a,int b){a-=b;a+=a>>31&mod;}
inline void Mul(int &a,int b){a=mul(a,b);}
inline void ex_gcd(int a,int b,int &x,int &y){if(!b){x=1,y=0;return ;}ex_gcd(b,a%b,y,x);y-=a/b*x;
}
inline int inv(int a){int x,y;ex_gcd(a,mod,x,y);return dec(x,0);
}cs int N=5e2+7;
int fac[N];
int C[N][N],s[N][N];
inline void init(){fac[0]=fac[1]=1;s[0][0]=1;for(int re i=2;i<N;++i)fac[i]=mul(fac[i-1],i);for(int re i=0;i<N;++i){C[i][0]=1;for(int re j=1;j<=i;++j){C[i][j]=add(C[i-1][j],C[i-1][j-1]);s[i][j]=dec(s[i-1][j-1],mul(s[i-1][j],i-1));}}
}
//x_n = A * x_1^n + B * x_2^n
namespace Solve2{struct cp{int x,y;//x + y\sqrt 5cp(){}cp(int _x,int _y):x(_x),y(_y){}friend cp operator+(cs cp &a,cs cp &b){return cp(add(a.x,b.x),add(a.y,b.y));}friend cp operator-(cs cp &a,cs cp &b){return cp(dec(a.x,b.x),dec(a.y,b.y));}friend cp operator*(cs cp &a,cs cp &b){return cp(add(mul(a.x,b.x),mul(5,mul(a.y,b.y))),add(mul(a.x,b.y),mul(a.y,b.x)));}friend cp operator+(cs cp &a,int b){return cp(add(a.x,b),a.y);}friend cp operator-(cs cp &a,int b){return cp(dec(a.x,b),a.y);}friend cp operator*(cs cp &a,int b){return cp(mul(a.x,b),mul(a.y,b));}void operator+=(cs cp &b){Inc(x,b.x),Inc(y,b.y);}};inline cp inv(cs cp &a){return cp(a.x,dec(0,a.y))*::inv(dec(mul(a.x,a.x),mul(5,mul(a.y,a.y))));}inline cp power(cp a,ll b){cp res(1,0);for(;b;b>>=1,a=a*a)if(b&1)res=res*a;return res;}cs cp A=cp(0,::inv(5)),B=cp(0,mod-::inv(5)),x_1=cp(1,1)*::inv(2),x_2=cp(1,mod-1)*::inv(2);cp pw_A[N],pw_B[N],pw_1[N],pw_2[N];inline void init_pw(){pw_A[0]=pw_B[0]=pw_1[0]=pw_2[0]=cp(1,0);for(int re i=1;i<N;++i){pw_A[i]=pw_A[i-1]*A;pw_B[i]=pw_B[i-1]*B;pw_1[i]=pw_1[i-1]*x_1;pw_2[i]=pw_2[i-1]*x_2;}}inline cp calc(cp a,ll n){if(a.x==1&&a.y==0)return cp((n+1)%mod,0);return (power(a,n+1)-1)*inv(a-1);}inline int solve(ll l,ll r,int k){cp res(0,0);for(int re i=0;i<=k;++i){for(int re j=0;j<=i;++j){res+=pw_A[j]*pw_B[i-j]*mul(C[i][j],s[k][i])*(calc(pw_1[j]*pw_2[i-j],r)-calc(pw_1[j]*pw_2[i-j],l-1));}}return mul(res.x,::inv(fac[k]));}inline void main(int T){init_pw();while(T--){ll l,r;int k;scanf("%lld%lld%d",&l,&r,&k);cout<<mul(::inv((r-l+1)%mod),solve(l+1,r+1,k))<<"\n";}}
}namespace Solve3{struct cp{int x,y;//x + y\sqrt 3cp(){}cp(int _x,int _y):x(_x),y(_y){}friend cp operator+(cs cp &a,cs cp &b){return cp(add(a.x,b.x),add(a.y,b.y));}friend cp operator-(cs cp &a,cs cp &b){return cp(dec(a.x,b.x),dec(a.y,b.y));}friend cp operator*(cs cp &a,cs cp &b){return cp(add(mul(a.x,b.x),mul(3,mul(a.y,b.y))),add(mul(a.x,b.y),mul(a.y,b.x)));}friend cp operator+(cs cp &a,int b){return cp(add(a.x,b),a.y);}friend cp operator-(cs cp &a,int b){return cp(dec(a.x,b),a.y);}friend cp operator*(cs cp &a,int b){return cp(mul(a.x,b),mul(a.y,b));}void operator+=(cs cp &b){Inc(x,b.x),Inc(y,b.y);}};inline cp inv(cs cp &a){return cp(a.x,dec(0,a.y))*::inv(dec(mul(a.x,a.x),mul(3,mul(a.y,a.y))));}inline cp power(cp a,ll b){cp res(1,0);for(;b;b>>=1,a=a*a)if(b&1)res=res*a;return res;}cs cp A=cp(3,1)*::inv(6),B=cp(3,mod-1)*::inv(6),x_1=cp(2,1),x_2=cp(2,mod-1);cp pw_A[N],pw_B[N],pw_1[N],pw_2[N];inline void init_pw(){pw_A[0]=pw_B[0]=pw_1[0]=pw_2[0]=cp(1,0);for(int re i=1;i<N;++i){pw_A[i]=pw_A[i-1]*A;pw_B[i]=pw_B[i-1]*B;pw_1[i]=pw_1[i-1]*x_1;pw_2[i]=pw_2[i-1]*x_2;}}inline cp calc(cp a,ll n){if(a.x==1&&a.y==0)return cp((n+1)%mod,0);return (power(a,n+1)-1)*inv(a-1);}inline int solve(ll l,ll r,int k){cp res(0,0);for(int re i=0;i<=k;++i){for(int re j=0;j<=i;++j){res+=pw_A[j]*pw_B[i-j]*mul(C[i][j],s[k][i])*(calc(pw_1[j]*pw_2[i-j],r)-calc(pw_1[j]*pw_2[i-j],l-1));}}return mul(res.x,::inv(fac[k]));}inline void main(int T){init_pw();while(T--){ll l,r;int k;scanf("%lld%lld%d",&l,&r,&k);cout<<mul(::inv((r-l+1)%mod),solve(l+1>>1,r>>1,k))<<"\n";}}
}signed main(){#ifdef zxyoifreopen("calc.in","r",stdin);
#endifint T,m;scanf("%d%d",&T,&m);init();if(m==2)Solve2::main(T);else Solve3::main(T);return 0;
}

【BJOI2019】勘破神机(下降幂转自然幂)(第一类斯特林数)(特征方程)相关推荐

  1. [BJOI2019]勘破神机

    [BJOI2019]勘破神机 推式子好题 m=2,斐波那契数列,$f_{n+1}$项 不妨$++l,++r$,直接求$f_n$ 求$\sum C(f_n,k)$,下降幂转化成阶乘幂,这样都是多项式了, ...

  2. [BJOI2019]勘破神机(斯特林数,数论)

    [BJOI2019]勘破神机(斯特林数,数论) 题面 洛谷 题解 先考虑\(m=2\)的情况. 显然方案数就是\(f_i=f_{i-1}+f_{i-2}\),即斐波那契数,虽然这里求出来是斐波那契的第 ...

  3. [BJOI2019]勘破神机(斯特林数+二项式定理+数学)

    题意:f[i],g[i]分别表示用1*2的骨牌铺2*n和3*n网格的方案数,求ΣC(f(i),k)和ΣC(g(i),k),对998244353取模,其中l<=i<=r,1<=l< ...

  4. luogu P5320 [BJOI2019]勘破神机

    传送门 首先我们要知道要求什么.显然每次放方块要放一大段不能从中间分开的部分.设\(m=2\)方案为\(f\),\(m=3\)方案为\(g\),\(m=2\)可以放一个竖的,或者两个横的,所以\(f_ ...

  5. #loj3090 [BJOI2019] 勘破神机

    简单线性代数练习题 首先翻开具体数学生成函数一章,可以发现\(F(n),G(n)\)满足以下递推式 \[F(n)=F(n-1)+F(n-2),F(0)=1,F(1)=1\] \[G(n)=4G(n-2 ...

  6. [BJOI2019]勘破神机(第一类斯特林数,斐波那契数列)

    真的是好题,只不过强行多合一有点过分了-- 题目大意: $T$ 组数据.每个测试点中 $m$ 相同. 对于每组数据,给定 $l,r,k$,请求出 $\dfrac{1}{r-l+1}\sum\limit ...

  7. BJOI2019 勘破神机 新解

    考场上就随便莽了个 Θ(k2log⁡r)\Theta(k^2\log r)Θ(k2logr) 的做法发现反正能过,就不管了--直到最近又提起这道题. 事情的经过其实是这样的--偶然看到了 cz_xuy ...

  8. 【LOJ】#3090. 「BJOI2019」勘破神机

    LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...

  9. 【luogu P5320】勘破神机(数学)(数列特征方程)(第一类斯特林数)

    勘破神机 题目链接:luogu P5320 题目大意 给你 l,r,kl,r,kl,r,k(其中 l,rl,rl,r 很大,k≤501k\leq 501k≤501),求: 1r−l+1∑i=lrCfi ...

最新文章

  1. jxl解析excel
  2. 不该建索引及不走索引的原因
  3. oracle emp数据库或数据误删恢复
  4. android TextView 的垂直滚动
  5. dos下登录fedora下的vsftp失败
  6. leetcode402. 移掉K位数字
  7. 【JavaWeb】HTML+CSS
  8. 算法笔记_202:第三届蓝桥杯软件类决赛真题(Java高职)
  9. Android 应用开发----ViewPager---PagerTitleStrip添加标题栏
  10. java8读流_JAVA: Java8流逐行读取文件
  11. vue 机场引导_vue2旅客引导平台
  12. 计算机在开机时会进行自检遇到,电脑开机自检卡住了怎么办
  13. QT for Android 修改图标与名称
  14. 计算机概论易错题总结:概念类
  15. 部署开源项目记录 - 部署seata时遇到的问题
  16. wamp橙色不变绿的几个主要原因
  17. 关于更新Windows11后eNSP路由器启动不了一直报“‘错误代码:40”的问题
  18. 腾讯游戏业务竟然是这样利用低代码平台的 | ArchSummit
  19. 吴恩达机器学习第十周测试
  20. ETH基于POA的环境搭建

热门文章

  1. easyExcel自定义背景颜色easyPoi自定义修改表头背景色
  2. 计算机无线网卡连接网络,无线网络连接不稳定
  3. Vijos 1055 奶牛浴场 最大子矩阵 算♂法①
  4. 一个在图片上写字的方法
  5. 一杯苦咖啡 公司来了个漂亮女实习程序员
  6. 央视解说之韩乔生巅峰之作--夏普
  7. 【叶片识别】基于matlab LBP植物叶片识别【含Matlab源码 1702期】
  8. flyingsaucer转换多个html,Flying Saucer实现html转pdf(一些有关问题,持续更新)
  9. [css] 怎么自定义鼠标指针的图案?
  10. 多家知名企业笔试面试精华