[BJOI2019]勘破神机(第一类斯特林数,斐波那契数列)
真的是好题,只不过强行多合一有点过分了……
题目大意:
$T$ 组数据。每个测试点中 $m$ 相同。
对于每组数据,给定 $l,r,k$,请求出 $\dfrac{1}{r-l+1}\sum\limits_{n=l}^r\dbinom{f(n,m)}{k}\bmod 998244353$。
其中 $f(n,m)$ 表示用 $1\times 2$ 的骨牌(可以变成 $2\times 1$)填满 $n\times m$ 的网格的方案数。
$1\le T\le 5,1\le l\le r\le 10^{18},1\le k\le 501,2\le m\le 3$。保证 $r-l+1$ 不是 $998244353$ 的倍数。
$2\le m\le 3$,明显二合一了。(其实后面会发现不止二合一)
先看 $m=2$。众所周知 $f(n,2)=fib_{n+1}$。然后就变成这题了。注意 $\sqrt{5}$ 在模 $998244353$ 下也没有意义,还是要扩系。
接下来看 $m=3$。
首先肯定 $n$ 是偶数的时候 $f(n,3)$ 才不为 $0$,那么设 $g_n=f(2n,3)$,然后要求就是 $\sum\limits_{n=\lceil\frac{l}{2}\rceil}^{\lfloor\frac{r}{2}\rfloor}g_n$。(为方便下文假设求 $l$ 到 $r$ 的和)
(从题解偷张图,%%%vixbob)
说得应该很清楚了。那么 $g_n=3g_{n-1}+2\sum\limits_{i=0}^{n-2}g_i$。
那么 $g_{n+1}-g_n=3g_n-g_{n-1}$,得递推公式 $g_n=4g_{n-1}-g_{n-2}$。初始 $g_0=1,g_1=3$。
用特征方程解出通项公式:
$$g_n=\dfrac{3+\sqrt{3}}{6}(2+\sqrt{3})^n+\dfrac{3-\sqrt{3}}{6}(2-\sqrt{3})^n$$
然后就一样了。
时间复杂度 $O(Tk^2\log r)$。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=,mod=,inv2=,inv5=,inv6=;
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline ll read(){
char ch=getchar();ll x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int t,m,k,fac[maxn],invfac[maxn],S[maxn][maxn],C[maxn][maxn];
ll l,r;
inline int add(int x,int y){return x+y<mod?x+y:x+y-mod;}
inline int sub(int x,int y){return x<y?x-y+mod:x-y;}
inline int mul(int x,int y){return 1ll*x*y%mod;}
inline int qpow(int a,ll b){
int ans=;
for(;b;b>>=,a=mul(a,a)) if(b&) ans=mul(ans,a);
return ans;
}
template<int T>
struct comp{
int x,y;
comp(const int xx=,const int yy=):x(xx),y(yy){}
inline comp operator+(const comp &c)const{return comp(add(x,c.x),add(y,c.y));}
inline comp operator-(const comp &c)const{return comp(sub(x,c.x),sub(y,c.y));}
inline comp operator*(const comp &c)const{return comp(add(mul(x,c.x),mul(T,mul(y,c.y))),add(mul(x,c.y),mul(y,c.x)));}
inline comp inv()const{
comp ans(x,y?mod-y:);
int dn=qpow(sub(mul(x,x),mul(T,mul(y,y))),mod-);
return ans*dn;
}
inline comp operator/(const comp &c)const{return *this*c.inv();}
inline bool operator==(const comp &c)const{return x==c.x && y==c.y;}
};
comp<> a2(,inv5),b2(,mod-inv5),x2(inv2,inv2),y2(inv2,mod-inv2);
comp<> a3(inv2,inv6),b3(inv2,mod-inv6),x3(,),y3(,mod-);
template<int T>
inline comp<T> cqpow(comp<T> a,ll b){
comp<T> ans(,);
for(;b;b>>=,a=a*a) if(b&) ans=ans*a;
return ans;
}
template<int T>
comp<T> calc(comp<T> x,ll l,ll r){
if(x==) return (r-l+)%mod;
return (cqpow(x,r+)-cqpow(x,l))/(x-);
}
int main(){
FOR(i,,) C[i][]=C[i][i]=;
FOR(i,,) FOR(j,,i-) C[i][j]=add(C[i-][j],C[i-][j-]);
S[][]=;
FOR(i,,) FOR(j,,i) S[i][j]=add(mul(i-,S[i-][j]),S[i-][j-]);
fac[]=;
FOR(i,,) fac[i]=mul(fac[i-],i);
invfac[]=qpow(fac[],mod-);
ROF(i,,) invfac[i]=mul(invfac[i+],i+);
t=read();m=read();
while(t--){
l=read();r=read();k=read();
if(m==){
int ans=;
FOR(i,,k){
int s=;
FOR(j,,i){
comp<> tmp1=cqpow(a2,j)*cqpow(b2,i-j),tmp2=cqpow(x2,j)*cqpow(y2,i-j);
s=add(s,mul(C[i][j],(tmp1*calc(tmp2,l+,r+)).x));
}
s=mul(s,S[k][i]);
if((k-i)&) ans=sub(ans,s);
else ans=add(ans,s);
}
printf("%d\n",mul(mul(ans,invfac[k]),qpow((r-l+)%mod,mod-)));
}
else{
ll lll=(l+)>>,rrr=r>>;
if(lll>rrr){puts("");continue;}
int ans=;
FOR(i,,k){
int s=;
FOR(j,,i){
comp<> tmp1=cqpow(a3,j)*cqpow(b3,i-j),tmp2=cqpow(x3,j)*cqpow(y3,i-j);
s=add(s,mul(C[i][j],(tmp1*calc(tmp2,lll,rrr)).x));
}
s=mul(s,S[k][i]);
if((k-i)&) ans=sub(ans,s);
else ans=add(ans,s);
}
printf("%d\n",mul(mul(ans,invfac[k]),qpow((r-l+)%mod,mod-)));
}
}
}
[BJOI2019]勘破神机(第一类斯特林数,斐波那契数列)的更多相关文章
- [BJOI2019]勘破神机(斯特林数,数论)
[BJOI2019]勘破神机(斯特林数,数论) 题面 洛谷 题解 先考虑\(m=2\)的情况. 显然方案数就是\(f_i=f_{i-1}+f_{i-2}\),即斐波那契数,虽然这里求出来是斐波那契的第 ...
- [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< ...
- [Luogu5320][BJOI2019]堪破神机(DP+斯特林数)
https://www.cnblogs.com/cjyyb/p/10747543.html 特征方程+斯特林反演化简式子,要注意在模998244353意义下5没有二次剩余,所以每个数都要用$a+b\s ...
- [BJOI2019]勘破神机
[BJOI2019]勘破神机 推式子好题 m=2,斐波那契数列,$f_{n+1}$项 不妨$++l,++r$,直接求$f_n$ 求$\sum C(f_n,k)$,下降幂转化成阶乘幂,这样都是多项式了, ...
- 题解 P5320 - [BJOI2019]勘破神机(推式子+第一类斯特林数)
洛谷题面传送门 神仙题(为什么就没能自己想出来呢/zk/zk) 这是我 AC 的第 \(2\times 10^3\) 道题哦 首先考虑 \(m=2\) 的情况,我们首先可以想到一个非常 trivial ...
- luogu P5320 [BJOI2019]勘破神机
传送门 首先我们要知道要求什么.显然每次放方块要放一大段不能从中间分开的部分.设\(m=2\)方案为\(f\),\(m=3\)方案为\(g\),\(m=2\)可以放一个竖的,或者两个横的,所以\(f_ ...
- #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 ...
- 【LOJ】#3090. 「BJOI2019」勘破神机
LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...
- CF717A Festival Organization(第一类斯特林数,斐波那契数列)
题目大意:求 $\sum\limits_{n=l}^{r}\dbinom{f_n}{k}\bmod 10^9+7$.其中 $f_n$ 是长度为 $n$ 的 $01$ 序列中,没有连续两个或超过两个 $ ...
随机推荐
- Harbor + Https 部署
关闭防火墙和selinux systemctl stop firewalld sed -i 's/SELINUX=.*/SELINUX=disabled/g' /etc/sysconfig/selin ...
- 行为驱动:Cucumber + Java - 实现数据的参数化
1.什么是参数化 实际设计测试用例过程中,我们经常会用等价类.边界值这样的方法,针对一个功能进行测试数据上的测试,比如一个输入框,正向数据.逆向数据,非法输入等等 2.Cucumber的数据驱动 同上 ...
- SQLyog 图形化数据库的操作教程
首先SQLyog作为mysql的图形化操作工具,是一款非常好用的工具. 操作说明 1.打开工具,点击[新建]输入名称.用户名:root,密码是安装时自己设置的(一定要记住的),端口号默认是:3306, ...
- date——系统时间的命令
这是一个可以用各种姿势获得各种时间的命令.最近在写自动化定时脚本时学了一下. 参考:https://www.cnblogs.com/ginvip/p/6357378.html 比如: 利用cronta ...
- RocketMQ多master多salve集群搭建
一.RocketMQ集群模式简介 单Master方式 风险比较大, 一旦Broker重启或者宕机, 将导致整个环境不可用, 不建议线上使用. 多Master模式 一个集群中没有slave, 全是mas ...
- vue入门案例
1.技术在迭代,有时候你为了生活没有办法,必须掌握一些新的技术,可能你不会或者没有时间造轮子,那么就先把利用轮子吧. <!DOCTYPE html> <html> <he ...
- C# SmtpClient 发邮件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- ASP.Net Core使用Ajax局部更新
由于目前ASP.NET Core中没有提供Ajax帮助器,所以参照 上一篇帖文,使用data-ajax-*属性来使用jQuery Unobtrusive Ajax功能实现HTML的局部页面元素更新. ...
- Python - MySQL - mysql-connector -第二十四天
序言 搭建MySQL环境MySQL Server. 请参考:https://blog.csdn.net/m0_37788308/article/details/79965378 或者 https:// ...
- ASP.NET 中关GridView里加入CheckBox 在后台获取不到选中状态的问题
<!-- 在GridView里添加CheckBox选择控件 !--> <ItemTemplate> <asp:CheckBox ID="CheckBox&quo ...