LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域
题目: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=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
return fx?ret:-ret;
}
const int N=,mod=;
int upt(int x){while(x>=mod)x-=mod;while(x<)x+=mod;return x;}
int pw(int x,ll k)
{int ret=;while(k){if(k&)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=;}return ret;} int k,s1[N][N],c[N][N],bs,tlen2,ans;ll tl,tlen;
struct Node{
int x,y;
Node(int x=,int y=):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(,);
while(k){if(k&)ret=ret*x;x=x*x;k>>=;}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-);
return Node((ll)u.x*tp%mod,upt(-(ll)u.y*tp%mod));
}
void init(int lx)
{
s1[][]=;
for(int i=;i<=k;i++)
for(int j=;j<=i;j++)
s1[i][j]=(s1[i-][j-]+(ll)s1[i-][j]*(i-))%mod;
for(int i=;i<=k;i++)c[i][]=;
for(int i=;i<=k;i++)
for(int j=;j<=i;j++)
c[i][j]=upt(c[i-][j-]+c[i-][j]); one=Node(,);
if(lx==)
{
int tp=pw(,mod-); A[]=Node(,tp); B[]=Node(,upt(-tp));
tp=pw(,mod-); x1[]=Node(tp,tp); x2[]=Node(tp,upt(-tp));
}
else
{
int tp=pw(,mod-); A[]=Node((ll)*tp%mod,tp);
B[]=Node((ll)*tp%mod,upt(-tp));
x1[]=Node(,); x2[]=Node(,upt(-));
}
A[]=one; for(int i=;i<=k;i++)A[i]=A[i-]*A[];
B[]=one; for(int i=;i<=k;i++)B[i]=B[i-]*B[];
x1[]=one; for(int i=;i<=k;i++)x1[i]=x1[i-]*x1[];
x2[]=one; for(int i=;i<=k;i++)x2[i]=x2[i-]*x2[];
}
Node cal(Node x)
{
if(x.x==&&x.y==)return Node(tlen2,);//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=; init();
int iv=pw((r-l+)%mod,mod-); l++; r++;
tl=l; tlen=(r-l+); tlen2=(r-l+)%mod;
for(int i=,fx=((k&)?upt(-):);i<=k;i++,fx=upt(-fx))
{
int tp=;
for(int j=;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=; for(int i=;i<=k;i++)ml=(ll)ml*i%mod;
ans=(ll)ans*pw(ml,mod-)%mod;
}
void solve3()
{
ll l=rdn(),r=rdn(); k=rdn(); bs=; init();
int iv=pw((r-l+)%mod,mod-); l=(l+)>>; r=r>>;
tl=l; tlen=(r-l+); tlen2=(r-l+)%mod;
for(int i=,fx=((k&)?upt(-):);i<=k;i++,fx=upt(-fx))
{
int tp=;
for(int j=;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=; for(int i=;i<=k;i++)ml=(ll)ml*i%mod;
ans=(ll)ans*pw(ml,mod-)%mod;
}
int main()
{
int op=rdn(); op=rdn();
if(op==)solve2(); else solve3();
printf("%d\n",ans);
return ;
}
LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域的更多相关文章
- loj 3090 「BJOI2019」勘破神机 - 数学
题目传送门 传送门 题目大意 设$F_{n}$表示用$1\times 2$的骨牌填$2\times n$的网格的方案数,设$G_{n}$$表示用$1\times 2$的骨牌填$3\times n$的网 ...
- 【LOJ】#3090. 「BJOI2019」勘破神机
LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...
- LOJ 2304 「NOI2017」泳池——思路+DP+常系数线性齐次递推
题目:https://loj.ac/problem/2304 看了各种题解…… \( dp[i][j] \) 表示有 i 列.第 j 行及以下默认合法,第 j+1 行至少有一个非法格子的概率,满足最大 ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- [BJOI2019]勘破神机(斯特林数,数论)
[BJOI2019]勘破神机(斯特林数,数论) 题面 洛谷 题解 先考虑\(m=2\)的情况. 显然方案数就是\(f_i=f_{i-1}+f_{i-2}\),即斐波那契数,虽然这里求出来是斐波那契的第 ...
- [BJOI2019]勘破神机
[BJOI2019]勘破神机 推式子好题 m=2,斐波那契数列,$f_{n+1}$项 不妨$++l,++r$,直接求$f_n$ 求$\sum C(f_n,k)$,下降幂转化成阶乘幂,这样都是多项式了, ...
- LOJ 3089 「BJOI2019」奥术神杖——AC自动机DP+0/1分数规划
题目:https://loj.ac/problem/3089 没想到把根号之类的求对数变成算数平均值.写了个只能得15分的暴力. #include<cstdio> #include< ...
- LOJ 3094 「BJOI2019」删数——角标偏移的线段树
题目:https://loj.ac/problem/3094 弱化版是 AGC017C . 用线段树维护那个题里的序列即可. 对应关系大概是: 真实值的范围是 [ 1-m , n+m ] :考虑设偏移 ...
随机推荐
- Spring框架各Jar包说明
来源:https://blog.csdn.net/weisong530624687/article/details/50888094 前言: (1)spring.jar 是包含有完整发布模块的单个ja ...
- time in china
https://www.timeanddate.com/worldclock/china
- 【ABAP系列】SAP 后台JOB如何DEBUG
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[ABAP系列]SAP 后台JOB如何DEBUG ...
- Win7 VSCode 离线安装Rust语言及环境配置
前置依赖 装过Visual Studio或Visual Studio Build Tool 2015 下载Rust离线安装包 https://forge.rust-lang.org/other-ins ...
- 004--PowerDesigner设置显示1对多等关系
PowerDesigner设置显示1对多等关系 Step1:双击Reference连接线 Step2:设置Cardinality Step3:显示Cardinality Tools->Displ ...
- springboot启动脚本
#!/bin/sh JAVA_HOME="/ulic1/jdk/jdk1.8.0_201/bin" export JAVA_HOME lsof -i:9010 |awk '{pri ...
- mac下使用iterm实现自动登陆
1.通过brew安装sshpass(手动安装也可以) ①brew安装sshpass brew install https://raw.githubusercontent.com/kadwanev/bi ...
- MySQL-第九篇分组和组函数
1.组函数 组函数:即多行函数,组函数将一组记录作为整体计算,每组记录返回一个结果,而不是每条记录返回一个结果. 2.常用的组函数有: 1>avg([distinct|all]expr):计算多 ...
- Spring Boot 1.x 正式退役,2.x大步向前!
Java技术栈 www.javastack.cn 优秀的Java技术公众号 早在<Spring Boot 2.1.5 正式发布,1.5.x 即将结束使命!>一文中栈长就提醒大家 Sprin ...
- php开启xdebug扩展及xdebug通信原理
xdebug调试原理 IDE(如PHPStorm)已经集成了一个遵循BGDP的XDebug插件,当开启它的时候, 会在本地开一个XDebug调试服务,监听在调试器中所设置的端口上,默认是9000,这个 ...