真的是好题,只不过强行多合一有点过分了……

题目大意:

$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]勘破神机(第一类斯特林数,斐波那契数列)的更多相关文章

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

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

  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< ...

  3. [Luogu5320][BJOI2019]堪破神机(DP+斯特林数)

    https://www.cnblogs.com/cjyyb/p/10747543.html 特征方程+斯特林反演化简式子,要注意在模998244353意义下5没有二次剩余,所以每个数都要用$a+b\s ...

  4. [BJOI2019]勘破神机

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

  5. 题解 P5320 - [BJOI2019]勘破神机(推式子+第一类斯特林数)

    洛谷题面传送门 神仙题(为什么就没能自己想出来呢/zk/zk) 这是我 AC 的第 \(2\times 10^3\) 道题哦 首先考虑 \(m=2\) 的情况,我们首先可以想到一个非常 trivial ...

  6. luogu P5320 [BJOI2019]勘破神机

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

  7. #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 ...

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

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

  9. CF717A Festival Organization(第一类斯特林数,斐波那契数列)

    题目大意:求 $\sum\limits_{n=l}^{r}\dbinom{f_n}{k}\bmod 10^9+7$.其中 $f_n$ 是长度为 $n$ 的 $01$ 序列中,没有连续两个或超过两个 $ ...

随机推荐

  1. 物联网架构成长之路(39)-Bladex开发框架环境搭建

    0.前言 上一篇博客已经介绍了,阶段性小结.目前第一版的物联网平台已经趋于完成.框架基本不变了,剩下就是调整一些UI,还有配合硬件和市场那边,看看怎么推广这个平台.能不能挣点外快.第一版系统虽然简陋, ...

  2. mysql8

    解决navicat不能连接问题: grant all privileges on *.* to ‘root’@’%’;ALTER USER 'root'@'localhost' IDENTIFIED ...

  3. hdu-6071 Lazy Running

    In HDU, you have to run along the campus for 24 times, or you will fail in PE. According to the rule ...

  4. Python 多进程池

    def get_html(n): time.sleep(n) print("sub_progress success") return n # 多进程池 pool = multip ...

  5. [线段树]区间修改&区间查询问题

    区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...

  6. 数据持久化之Data Volume

    废话不多说直接操作 1.启动一个MySQL测试容器 [root@localhost labs]# docker pull mysql #下载MySQL镜像 [root@localhost labs]# ...

  7. 机器学习(十)-------- 降维(Dimensionality Reduction)

    降维(Dimensionality Reduction) 降维的目的:1 数据压缩 这个是二维降一维 三维降二维就是落在一个平面上. 2 数据可视化 降维的算法只负责减少维数,新产生的特征的意义就必须 ...

  8. 【Maven】【IDEA】在idea中开发web项目,解决maven的jar包冲突的方法

    在idea中开发web项目,解决maven的jar包冲突的方法 第一步: 先对项目进行 clean ,再进行install 第二步: 出现NoSuchMethodException,ClassNotF ...

  9. AppScan基础使用 - 初学篇

    最近找工作,阿里的面试官问过了安全,以前面试中也问到了安全,呆过的公司,朋友呆过的公司,发现安全测试很少 ,可能是应用的比较少. 当今社会安全还是比较重要的,学学有好处,大概了解下  .因为个人比较懒 ...

  10. shell脚本实现自动化安装linux版本的loadrunner agent(centos6.8)

    #!/bin/bash #Centos6下安装LoadRunner负载机 #@author Agoly #@date #@source 高级测试技术交流圈: yum -y install expect ...