[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=0;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);for(x=numb;isdigit(ch=getchar());x=x*10+numb);(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/10)output(x/10);putchar(x%10+'0');}
template<class T>il void ot(T x){if(x<0) 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=998244353;
const int N=505;
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=1;while(y){if(y&1) ret=mul(ret,x);x=mul(x,x);y>>=1;}return ret;
}
int inv[1000000+5];
int ni(int x){// cout<<" ni x "<<x<<endl;return x<=1000000?inv[x]:qm(x,mod-2);
}
struct po{int a,b;po(){a=0;b=0;}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(0,mod-mul(a.b,mom)));}po friend operator -(po a){return po(ad(0,mod-a.a),ad(0,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][4];
po qm(po x,ll y){po ret;ret.a=1;while(y){if(y&1) ret=ret*x;x=x*x;y>>=1;}return ret;
}
po calc(po Q,ll n){// Q.op();if(Q.a==1&&Q.b==0){return po((n+1)%mod,0);}po tmp=Q;tmp=qm(tmp,n+1);tmp=-tmp;tmp.a=ad(tmp.a,1);Q=-Q;Q.a=ad(Q.a,1);// 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[1]=1;for(reg i=2;i<=1000000;++i){inv[i]=mul(mod-mod/i,inv[mod%i]);}if(m==2) {C=5;A=po(0,ni(5));B=po(0,mod-ni(5));X=po(ni(2),ni(2));Y=po(ni(2),mod-ni(2));}else {C=3;A=po(ni(2),ni(6));B=po(ni(2),mod-ni(6));X=po(2,1);Y=po(2,mod-1);}mi[0][0]=mi[0][1]=mi[0][2]=mi[0][3]=po(1,0);for(reg i=1;i<=502;++i){mi[i][0]=mi[i-1][0]*A;mi[i][1]=mi[i-1][1]*B;mi[i][2]=mi[i-1][2]*X;mi[i][3]=mi[i-1][3]*Y;}s[0][0]=1;for(reg i=1;i<=502;++i){for(reg j=1;j<=502;++j){s[i][j]=ad(mul(s[i-1][j],i-1),s[i-1][j-1]);}}c[0][0]=1;for(reg i=1;i<=502;++i){c[i][0]=1;for(reg j=1;j<=502;++j){c[i][j]=ad(c[i-1][j-1],c[i-1][j]);}}ll l,r,k;while(t--){rd(l);rd(r);rd(k);if(m==2) {++l,++r;po ans;for(reg i=0;i<=k;++i){// cout<<" i "<<i<<endl;
                po tmp;for(reg j=0;j<=i;++j){// cout<<" jj "<<j<<endl;tmp=tmp+mi[j][0]*mi[i-j][1]*(calc(mi[j][2]*mi[i-j][3],r)-calc(mi[j][2]*mi[i-j][3],l-1))*c[i][j];// cout<<" bac "<<endl;
                }if((k-i)&1) tmp=-tmp;ans=ans+(tmp*s[k][i]);}for(reg i=1;i<=k;++i) ans=ans*inv[i];ans=ans*qm((r-l+1)%mod,mod-2);printf("%d\n",ans.a);}else{ ll L=l,R=r;l=(l+1)/2,r=r/2;po ans;for(reg i=0;i<=k;++i){// cout<<" i "<<i<<endl;
                po tmp;for(reg j=0;j<=i;++j){// cout<<" jj "<<j<<endl;tmp=tmp+mi[j][0]*mi[i-j][1]*(calc(mi[j][2]*mi[i-j][3],r)-calc(mi[j][2]*mi[i-j][3],l-1))*c[i][j];// cout<<" bac "<<endl;
                }if((k-i)&1) tmp=-tmp;ans=ans+(tmp*s[k][i]);}for(reg i=1;i<=k;++i) ans=ans*inv[i];ans=ans*qm((R-L+1)%mod,mod-2);// ans.op();printf("%d\n",ans.a);}}return 0;
}}
signed main(){Miracle::main();return 0;
}/*Author: *Miracle*
*/

转载于:https://www.cnblogs.com/Miracevin/p/10766319.html

[BJOI2019]勘破神机相关推荐

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

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

  2. BJOI2019 勘破神机 新解

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

  3. luogu P5320 [BJOI2019]勘破神机

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

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

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

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

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

  9. 【BJOI2019】勘破神机【数论】

    传送门(难得正经一回) 神题,思想值得学习. 首先明确题意: 两个子问题,一个2xN,一个3xN. 接下来对这个问题进行慢慢的推敲 解方案数 很明显,我们要先解决放置方案数的公式,才能做这个题. 对于 ...

最新文章

  1. 2018usnews计算机专业排名,2018年研究生计算机专业前50排名(美USNews版)
  2. .NET Core 使用Dapper 操作MySQL
  3. NodeJS Web模块
  4. 第二篇:在RHEL上用qemu-kvm安装xp
  5. 配置 Linux 阿里源
  6. 金庸武侠内功排行榜TOP10
  7. 中国联通沃商-上海大学生手机应用创意、开发大赛活动
  8. php laravel 增删查改,通过 Laravel Eloquent 模型实现简单增删改查操作
  9. 钉钉应用开发服务器API错误码原因及解决方法
  10. 将你的 Python 脚本转换为命令行程序
  11. aspose 插入图片的方法
  12. Dispose 和 GC 注意点
  13. iOS--AFN实现原理
  14. Windos10使用手册
  15. docker如何将镜像中的文件下载到本地
  16. 访问www.baidu.com的过程
  17. 分页计算起始页和总页数
  18. 寄存器英文全称中文翻译英文对照表
  19. 目前学UI设计好就业吗?做UI设计还会有发展潜力?
  20. WebDriverException( selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ executabl

热门文章

  1. 电脑删除文件找不到该项目怎么解决
  2. 安全审计——等级保护日志审计要求的一种解决方案
  3. 注册微信公总号的方法与种类
  4. 秦皇岛公积金计算 Python
  5. python处理数据
  6. 【华人学者风采】李海洲 新加坡国立大学
  7. 【电路设计小白】ADC芯片配置学习之一初期理论
  8. Unity-日志工具
  9. JS 把时间戳转化成YY-MM-DD
  10. 配音软件永久免费的有哪些?这几款免费的配音软件绝对适合你