题目:https://loj.ac/problem/3090

题解:https://www.luogu.org/blog/rqy/solution-p5320

1.用斯特林数把下降幂化为普通的幂次求和

2.找出通项公式,使得幂次变成二项式,进而将 [ l , r ] 的部分变成等比数列求和

3.模 998244353 下没有 \( \sqrt{5} \) ,所以“扩域”,就是把数表示成 \( a+b*\sqrt{5} \) ;\( \sqrt{3} \) 也同理

注意扩域之后,不满足费马小定理,所以快速幂的指数不能对 ( mod-1 ) 取模!!!

还是不太知道怎么求的通项。为什么是 \( f[n]=A*x_{1}^{n}+B*x_{2}^{n} \) 的形式呢?如果不是二阶怎么推?

UPD:

  设特征根是 x1,x2,...,xk,因为 x^n 是通解,又有线性性(?),所以通项可以写成 \( f(i)=A*x_1^i + B*x_2^i + ... \)

  但是有重根的话就不是这样。 k 重根的系数是次数界为 k 的多项式。这里的次数指的是 i 的几次幂。

  (k重根是针对根而言的,比如一个六次方程,x1=x2=2 , x3=5 , x4=x5=x6=1,那么 2 是2重根,5是单根,1是3重根)

  比如,\( f_i = 2*f_{i-1} - f_{i-2} \),\( f_0 = 1 , f_1 = 2 \)

  解出特征根是 x1=x2=1 ,那么可以设通项公式为 \( f(i)=(A*i+B)x^i \) ,解得 A=B=1 。

  又如,\( f_i = 4*f_{i-1} - f_{i-2} \) , \( f_0 = 1 , f_1 = 7 \)

  解出特征根是 x1=x2=2 ,设通项是 \( f(i)=(A*i+B)x^i \) ,解得 \( A=\frac{5}{2} , B=1 \)

  ^  ^

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll rdn()
{ll ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
const int N=505,mod=998244353;
int upt(int x){while(x>=mod)x-=mod;while(x<0)x+=mod;return x;}
int pw(int x,ll k)
{int ret=1;while(k){if(k&1)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=1;}return ret;}int k,s1[N][N],c[N][N],bs,tlen2,ans;ll tl,tlen;
struct Node{int x,y;Node(int x=0,int y=0):x(x),y(y) {}Node operator+ (const Node &b)const{ return Node(upt(x+b.x),upt(y+b.y));}Node operator- (const Node &b)const{ return Node(upt(x-b.x),upt(y-b.y));}Node operator* (const Node &b)const{ return Node(((ll)x*b.x+(ll)bs*y%mod*b.y)%mod,((ll)y*b.x+(ll)x*b.y)%mod);}
}A[N],B[N],x1[N],x2[N],one;
Node pw(Node x,ll k)
{ Node ret=Node(1,0);while(k){if(k&1)ret=ret*x;x=x*x;k>>=1;}return ret;}
Node Inv(Node u)
{int tp=upt(((ll)u.x*u.x-(ll)bs*u.y%mod*u.y)%mod);tp=pw(tp,mod-2);return Node((ll)u.x*tp%mod,upt(-(ll)u.y*tp%mod));
}
void init(int lx)
{s1[0][0]=1;for(int i=1;i<=k;i++)for(int j=1;j<=i;j++)s1[i][j]=(s1[i-1][j-1]+(ll)s1[i-1][j]*(i-1))%mod;for(int i=0;i<=k;i++)c[i][0]=1;for(int i=1;i<=k;i++)for(int j=1;j<=i;j++)c[i][j]=upt(c[i-1][j-1]+c[i-1][j]);one=Node(1,0);if(lx==2){int tp=pw(5,mod-2); A[1]=Node(0,tp); B[1]=Node(0,upt(-tp));tp=pw(2,mod-2); x1[1]=Node(tp,tp); x2[1]=Node(tp,upt(-tp));}else{int tp=pw(6,mod-2); A[1]=Node((ll)3*tp%mod,tp);B[1]=Node((ll)3*tp%mod,upt(-tp));x1[1]=Node(2,1); x2[1]=Node(2,upt(-1));}A[0]=one; for(int i=2;i<=k;i++)A[i]=A[i-1]*A[1];B[0]=one; for(int i=2;i<=k;i++)B[i]=B[i-1]*B[1];x1[0]=one; for(int i=2;i<=k;i++)x1[i]=x1[i-1]*x1[1];x2[0]=one; for(int i=2;i<=k;i++)x2[i]=x2[i-1]*x2[1];
}
Node cal(Node x)
{if(x.x==1&&x.y==0)return Node(tlen2,0);//tlen2 not tlen!!!Node d=Inv(one-x);d=d*pw(x,tl)*(one-pw(x,tlen));return d;
}
void solve2()
{ll l=rdn(),r=rdn(); k=rdn(); bs=5; init(2);int iv=pw((r-l+1)%mod,mod-2); l++; r++;tl=l; tlen=(r-l+1); tlen2=(r-l+1)%mod;for(int i=0,fx=((k&1)?upt(-1):1);i<=k;i++,fx=upt(-fx)){int tp=0;for(int j=0;j<=i;j++){Node tmp=x1[j]*x2[i-j];Node d=cal(tmp)*A[j]*B[i-j];tp=(tp+(ll)c[i][j]*d.x)%mod;}ans=(ans+(ll)s1[k][i]*fx%mod*tp)%mod;}ans=(ll)ans*iv%mod;int ml=1; for(int i=2;i<=k;i++)ml=(ll)ml*i%mod;ans=(ll)ans*pw(ml,mod-2)%mod;
}
void solve3()
{ll l=rdn(),r=rdn(); k=rdn(); bs=3; init(3);int iv=pw((r-l+1)%mod,mod-2); l=(l+1)>>1; r=r>>1;tl=l; tlen=(r-l+1); tlen2=(r-l+1)%mod;for(int i=0,fx=((k&1)?upt(-1):1);i<=k;i++,fx=upt(-fx)){int tp=0;for(int j=0;j<=i;j++){Node tmp=x1[j]*x2[i-j];Node d=cal(tmp)*A[j]*B[i-j];tp=(tp+(ll)c[i][j]*d.x)%mod;}ans=(ans+(ll)s1[k][i]*fx%mod*tp)%mod;}ans=(ll)ans*iv%mod;int ml=1; for(int i=2;i<=k;i++)ml=(ll)ml*i%mod;ans=(ll)ans*pw(ml,mod-2)%mod;
}
int main()
{int op=rdn(); op=rdn();if(op==2)solve2(); else solve3();printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10946142.html

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

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

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

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

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

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

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

  4. 「BJOI 2019」勘破神机

    传送门 problem 经过了一个月的艰苦尝试,你的研究团队破译了 "2""2""2" 型奥术宝石和 "3"" ...

  5. 【BJOI2019】勘破神机(下降幂转自然幂)(第一类斯特林数)(特征方程)

    传送门 题解: 完全自己推出来的第一道数学神题. 首先我们知道宽度为222的部分方案数是斐波那契数列. 设fnf_nfn​表示长度为nnn的时候方案数,题目要求的实际上是这个东西: ∑n=lr(fnk ...

  6. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

  7. [BJOI2019]勘破神机

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

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

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

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

最新文章

  1. 启动MongoDB shell客户端会什么会一闪而过
  2. 浏览器的加载与页面性能优化
  3. pdfbox 按章节读取_2020年智慧树APP微生物与健康第五单元章节测试网课答案大学课后答案...
  4. [导入]php 安全基础 第八章 共享主机 文件系统浏览
  5. 数据装载服务器_操作事项_06
  6. Vue本地图片循环加载显示不出来,vue img标签 :src地址拼接
  7. CVPR | 旷视提出Meta-SR:单一模型实现超分辨率任意缩放因子
  8. LeetCode 三天打渔两天晒网 剩下一天睡大觉
  9. 抓住眼球的美食海报模板|总有设计技法,吸引住你
  10. 艾伟也谈项目管理,学习腾讯的产品管理之道
  11. 高大上的集团名字_中国办公家具行业“高大上”的企业文化节 非中泰龙集团莫属!...
  12. android 开发客户端开发,【Android应用】Android网站客户端的开发介绍(1)
  13. 观众直呼“让她恰”,B站内容如何有效撬动ROI增长?
  14. vue组件中引入public文件,build打包后找不到资源报错404
  15. 第10章 Spark(全面解读Spark架构体系)
  16. 如何用laragon框架运行php文件
  17. http://mybatis.org/dtd/mybatis-3-mapper.dtd 报红
  18. 计算器软件测试数据,计算器软件测试报告.pdf
  19. python实现windows ie代理切换
  20. 启动rabbitmq,遇到发生系统错误2和发生系统错误5的解决方法

热门文章

  1. 第十三届蓝桥杯省赛 python B组复盘
  2. C/C++ __builtin 超实用位运算函数总结
  3. 小程序拨打电话功能,微信小程序点击手机号,拨打电话~!
  4. 医院绩效考核病案首页数据上报的难点及解决方案
  5. CentOS的下载与安装图文教程 (2020)
  6. 北理工乐学 42. 五年级小学生的题目
  7. 算法导论——钢条切割问题(C语言)
  8. Leetcode 1208. 尽可能使字符串相等(终于解决,晚安)
  9. 6500元都不到?战神Z8-DA5NP配置强悍,神船的性价比又回来了
  10. RECON-NG V5使用方法