[BJOI2019]勘破神机

推式子好题

m=2,斐波那契数列,$f_{n+1}$项

不妨$++l,++r$,直接求$f_n$

求$\sum C(f_n,k)$,下降幂转化成阶乘幂,这样都是多项式了,方便交换求和号

最后面的斐波那契数列用通项公式求。二项式展开。

交换求和号之后,枚举i,j 最后一项是等比数列求和。

%rqy

m=3,

n为奇数是0

n是偶数时,令n=n/2 递推公式:$g_n=4\times g_{n-1}+g_{n-2}$

证明:枚举从后往前第一个完全分出的块,除了块长为2的方案额外多一个外,其它都是两种。$g_n=g_{n-1}+2\times \sum_{i=0}^{n-1} g_{i}$

再写出:$g_{n-1}=g_{n-2}+2\times \sum_{i=0}^{n-2} g_{i}$两式做差移项即可得到。

用特征方程可以解得$g_n$的通项公式

$\sqrt 5$在mod 998244353下不存在,可以用$a+b\sqrt5$形式表示

注意,等比数列求和:$1+Q+....+Q^n=\frac{1-Q^{n+1}}{1-Q}$注意是n+1,因为有n+1项

#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int mod=;
const int N=;
int C;
int ad(int x,int y){
return x+y>=mod?x+y-mod:x+y;
}
int mul(int x,int y){
return (ll)x*y%mod;
}
ll qm(ll x,ll y){
ll ret=;
while(y){
if(y&) ret=mul(ret,x);
x=mul(x,x);
y>>=;
}
return ret;
}
int inv[+];
int ni(int x){
// cout<<" ni x "<<x<<endl;
return x<=?inv[x]:qm(x,mod-);
}
struct po{
int a,b;
po(){
a=;b=;
}
po(int aa,int bb){
a=aa;b=bb;
}
po friend operator +(po a,po b){
return po(ad(a.a,b.a),ad(a.b,b.b));
}
po friend operator -(po a,po b){
return po(ad(a.a,mod-b.a),ad(a.b,mod-b.b));
}
po friend operator ~(po a){
int mom=ni(ad(mul(a.a,a.a),mod-mul(C,mul(a.b,a.b))));
// cout<<" mom "<<mom<<endl;
return po(mul(a.a,mom),ad(,mod-mul(a.b,mom)));
}
po friend operator -(po a){
return po(ad(,mod-a.a),ad(,mod-a.b));
}
po friend operator *(po a,po b){
return po(ad(mul(a.a,b.a),mul(mul(a.b,b.b),C)),ad(mul(a.a,b.b),mul(a.b,b.a)));
}
po friend operator *(po a,int c){
return po(mul(a.a,c),mul(a.b,c));
}
po friend operator /(po a,po b){
return a*(~b);
}
void op(){
cout<<" a "<<a<<" b "<<b<<endl;
}
}A,B,X,Y,mi[N][];
po qm(po x,ll y){
po ret;ret.a=;
while(y){
if(y&) ret=ret*x;
x=x*x;
y>>=;
}
return ret;
}
po calc(po Q,ll n){
// Q.op();
if(Q.a==&&Q.b==){
return po((n+)%mod,);
}
po tmp=Q;tmp=qm(tmp,n+);
tmp=-tmp;tmp.a=ad(tmp.a,);
Q=-Q;Q.a=ad(Q.a,);
// Q.op();
// Q=~Q;
// Q.op();
return tmp*(~Q);
}
int s[N][N],c[N][N];
int main(){
int t;rd(t);int m;rd(m);
inv[]=;
for(reg i=;i<=;++i){
inv[i]=mul(mod-mod/i,inv[mod%i]);
}
if(m==) {
C=;A=po(,ni());B=po(,mod-ni());
X=po(ni(),ni());Y=po(ni(),mod-ni());
}
else {
C=;A=po(ni(),ni());B=po(ni(),mod-ni());
X=po(,);Y=po(,mod-);
}
mi[][]=mi[][]=mi[][]=mi[][]=po(,);
for(reg i=;i<=;++i){
mi[i][]=mi[i-][]*A;
mi[i][]=mi[i-][]*B;
mi[i][]=mi[i-][]*X;
mi[i][]=mi[i-][]*Y;
} s[][]=;
for(reg i=;i<=;++i){
for(reg j=;j<=;++j){
s[i][j]=ad(mul(s[i-][j],i-),s[i-][j-]);
}
}
c[][]=;
for(reg i=;i<=;++i){
c[i][]=;
for(reg j=;j<=;++j){
c[i][j]=ad(c[i-][j-],c[i-][j]);
}
} ll l,r,k;
while(t--){
rd(l);rd(r);rd(k);
if(m==) {
++l,++r;
po ans;
for(reg i=;i<=k;++i){
// cout<<" i "<<i<<endl;
po tmp;
for(reg j=;j<=i;++j){
// cout<<" jj "<<j<<endl;
tmp=tmp+mi[j][]*mi[i-j][]*(calc(mi[j][]*mi[i-j][],r)-calc(mi[j][]*mi[i-j][],l-))*c[i][j];
// cout<<" bac "<<endl;
}
if((k-i)&) tmp=-tmp;
ans=ans+(tmp*s[k][i]);
}
for(reg i=;i<=k;++i) ans=ans*inv[i];
ans=ans*qm((r-l+)%mod,mod-); printf("%d\n",ans.a);
}
else{
ll L=l,R=r;
l=(l+)/,r=r/;
po ans;
for(reg i=;i<=k;++i){
// cout<<" i "<<i<<endl;
po tmp;
for(reg j=;j<=i;++j){
// cout<<" jj "<<j<<endl;
tmp=tmp+mi[j][]*mi[i-j][]*(calc(mi[j][]*mi[i-j][],r)-calc(mi[j][]*mi[i-j][],l-))*c[i][j];
// cout<<" bac "<<endl;
}
if((k-i)&) tmp=-tmp;
ans=ans+(tmp*s[k][i]);
}
for(reg i=;i<=k;++i) ans=ans*inv[i];
ans=ans*qm((R-L+)%mod,mod-); // ans.op();
printf("%d\n",ans.a);
}
}
return ;
} }
signed main(){
Miracle::main();
return ;
} /*
Author: *Miracle*
*/

[BJOI2019]勘破神机的更多相关文章

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

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

  2. luogu P5320 [BJOI2019]勘破神机

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

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

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

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

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

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

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

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

  8. loj 3090 「BJOI2019」勘破神机 - 数学

    题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...

  9. LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域

    题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...

随机推荐

  1. ES6使用的一些方法

    查找数组中符合条件的所有记录 var list=[ {id:1,name:"张三"}, {id:2,name:"李四"}, {id:3,name:"王 ...

  2. Linux学习历程——Centos 7 uptime 、free命令

    一.命令介绍 uptime命令 uptime命令用于查看系统负载信息以及系统运行时间等. free命令 free命令用于查看当前系统中内存使用量信息. 二.实例 uptime命令实例 直接运行 upt ...

  3. 使用C++对物理网卡/虚拟网卡进行识别(包含内外网筛选)

    简介 在Socket编程的时候,我们需要实时获取我们所需要的IP地址.例如在编写后门的时候,我们可能需要获得有效的外网IP或内网IP:有时候我们可能需要判断我们获取的是否是虚拟机网卡,这时候就需要对每 ...

  4. Docker之常用命令(二)

    这篇博客就不扯皮了,简单粗暴地贴上自己整理的一份Docker常用命令. docker search ** // 查找镜像 docker pull nginx // 载入镜像 # -a 拉取所有tagg ...

  5. Docker资源限制

    我们在容器中运行docker镜像的时候,可以指定一些设置容器cpu和内存的相关参数来进行限制,这样子尽量把容器资源做的相对稳定一些.这些参数是在docker run/create命令使用,比如: -- ...

  6. docker-compose编排项目redis容器实现主从复制

    一.pip管理工具安装 docker-compose是python项目,所以安装需要通过python下的包管理工具pip安装.一般linux服务器都会预安装有python环境,所以优先检查python ...

  7. JS第一部分--ECMAScript5.0标准语法 (JS基础语法)

    一,调试语句 二,JS的引入方式 三,变量的使用 四,基本的数据类型 4.1,基本数据类型转换 4.2,字符串的常用方法 五,复杂数据类型 5.1,Array(数组)及常用方法 六,流程控制( 逻辑与 ...

  8. spark-RDD源码分析

    http://stark-summer.iteye.com/blog/2178096 RDD的核心方法: 首先看一下getPartitions方法的源码: getPartitions返回的是一系列pa ...

  9. java程序启动 环境属性的获取

    System.getProperties().list(System.out); 如果要获取某一个属性,例如常见的“操作系统” 则  System.getProperty("os.name& ...

  10. WEB框架-Django框架学习-预备知识

    今日份整理,终于开始整个阶段学习的后期了,今日开始学习Django的框架,加油,你是最胖的! 1.web基础知识 1.1 web应用 Web应用程序是一种可以通过Web访问的应用程序,程序的最大好处是 ...