[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$ 序列中,没有连续两个或超过两个 $ ...
随机推荐
- php imagemagick 翻译目录
图像处理(ImageMagick) 介绍 安装/配置 要求 安装 运行时配置 资源类型 预定义常数 例子 基本用法 Imagick - Imagick课 Imagick :: adaptiveBlur ...
- 『CSP2019-S 第二轮退役记』
Day0 到杭州的时候是下午,休息了一下就吃完饭了. 晚上的时候闲着没事复习了一下几个不太熟的数论板子,\(\mathrm{exgcd}\),\(\mathrm{ExCRT}\),\(\mathrm{ ...
- 异步编程,await async入门
网上很多异步编程的文章,提供一篇入门: 异步编程模型 .net支持3种异步编程模式: msdn:https://docs.microsoft.com/zh-cn/dotnet/standard/asy ...
- C#之初识异步
什么是异步 举个例子:小明的妈妈让小明烧一壶水,水烧开后要倒进水壶里,同时还需要把家里打扫一下. 小明的操作流程一:烧水---->等待至水烧开----->水倒进水壶里--------> ...
- Winform(C#)中Chart控件鼠标点击显示波形上相应点对应坐标轴的x,y值
方法一:鼠标点击波形 鼠标点击波形,显示点击位置的x,y值 private void chart1_MouseClick(object sender, MouseEventArgs e) //cha ...
- Windows 下MongoDB复制集配置
1.下载服务.https://www.mongodb.com/ 点击products 下拉第二列MongoDB server 选择 4.0.6 2.下载下来后 有限管理员运行 一路安装,可以不用 ...
- RT-Thread点亮led
下载默认工程 https://www.rt-thread.org/ 配置rtconfig.h #define STM32F103RE //修改成自己的板子 #define RT_HSE_VALUE 8 ...
- QTableWidget获取选中行内容
QList<QTableWidgetItem*> items = ui->tableWidget->selectedItems(); int count = items.cou ...
- web下载附件及修改名称
/** * @param: url 附件地址 * @param: filename 下载后的文件名 */ function download(url, filename) { getBlob(url, ...
- Fundebug录屏插件更新至0.5.0,新增domain参数
摘要: 通过配置domain来保证"视频"的正确录制 录屏功能介绍 Fundebug提供专业的异常监控服务,当线上应用出现 BUG 的时候,我们可以第一时间报警,帮助开发者及时发现 ...