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 ] :考虑设偏移 ...
随机推荐
- TCP概述
1. TCP提供的服务 我们知道TCP是一个面向连接.提供可靠数据数据传输服务的传输层协议.面向连接意味着发送端和接收端在交换数据前需要建立一个连接,和我们平常打电话一样,在通话前,需要拨号建立连接. ...
- java.lang.IllegalArgumentException: object is not an instance of declaring class新发现
文章目录 背景 报错 解决 引申 背景 因为要将方法缓存起来提高性能 报错 java.lang.IllegalArgumentException: object is not an instance ...
- Sublime Text3安装配置
Sublime Text3的所有package都可在如下网站检索 https://packagecontrol.io/browse 以下是我的插件列表 CoolFormat 一款C\C++\C#\CS ...
- 《JAVA设计模式》之模板模式(Template)
在阎宏博士的<JAVA与模式>一书中开头是这样描述模板方法(Template Method)模式的: 模板方法模式是类的行为模式.准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式 ...
- 三级级联(js实现)
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...
- CCNA 之 二 OSI七层模型
OSI网际互联 OSI的概念 英文全称Open System Interconnect 开放系统互联参数模型,是由ISO国际标准化组织 定义的.它是个灵活的.稳健的和可互操作的模型,并不是协议,使用来 ...
- IDEA远程代码实时同步(可以自动实时同步)
前言 开发时一般的平台都是windows,但windows对开发极其不友好,一般都会在本地开启虚拟机,安装上linux环境进行项目的部署测试.下面介绍一种windows主机与linux虚拟机代码同步的 ...
- BZOJ 4675(点分治)
题面 传送门 分析 由于期望的线性性,我们可以分别计算每个点对对答案的贡献 有三个人取数字,分开对每个人考虑 设每个人分别取了k个数,则一共有\(C_n^k\)种组合,选到每种组合的概率为\(\fra ...
- python开发之路-day03
一 文件操作一 介绍 计算机系统分为:计算机硬件,操作系统,应用程序三部分. 我们用python或其他语言编写的应用程序若想要把数据永久保存下来,必须要保存于硬盘中,这就涉及到应用程序要操作硬件,众所 ...
- go web编程——session管理机制设计与实现
原生Go语言没有实现session管理机制,所以如果使用原生Go语言进行web编程,我们需要自己进行session管理机制的设计与实现,本文将就此进行详细介绍,并实现一个简单的session管理机制. ...