[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<=r<=1e18
题解:显然打表发现f[i]为斐波那契数列,g[2i+1]=0,g[2i]=4g[2i-2]-g[2i-4]。
然后考虑m=2的斐波那契部分:k是给定的,仅需求斐波那契数列的下降幂,然后可以用第一类斯特林数去转换,然后求斐波那契数列的幂之和,假设斐波那契数列的两个特征根为a,b,则f(n,k)=(An-Bn)k/(√5)k,然后可以用二项式定理展开,但模数太差是998244353,所以要扩域。其实这道题是一道原题,原题链接:CF717A
m=3,因为也是二阶递推式,所以解法是一样的。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=,mod=;
int c[N][N],s[N][N];
int qpow(int a,ll b)
{
int ret=;
while(b)
{
if(b&)ret=1ll*ret*a%mod;
a=1ll*a*a%mod,b>>=;
}
return ret;
}
struct num{
int a,b,c;
num operator+(num x){return (num){(a+x.a)%mod,(b+x.b)%mod,c};}
num operator-(num x){return (num){(a-x.a+mod)%mod,(b-x.b+mod)%mod,c};}
num operator*(num x)
{return (num){(1ll*a*x.a+1ll*c*b%mod*x.b)%mod,(1ll*a*x.b+1ll*b*x.a)%mod,c};}
num inv()
{
int f=qpow((1ll*a*a-1ll*b*b%mod*c%mod+mod)%mod,mod-);
return (num){1ll*a*f%mod,1ll*(mod-b)*f%mod,c};
}
bool operator==(num x){return a==x.a&&b==x.b&&c==x.c;}
num operator/(num x){return (*this)*x.inv();}
};
num qpow(num a,ll b)
{
num ret=(num){,,a.c};
while(b)
{
if(b&)ret=ret*a;
a=a*a,b>>=;
}
return ret;
}
int F(ll n,int k)
{
if(!k)return n%mod;
n++;
num ans=(num){,,},A=(num){,,}/(num){,,},B=(num){,mod-,}/(num){,,};
num x=(num){,,},y=(num){,,};
for(int j=;j<=k;j++)y=y*B;
for(int j=;j<=k;j++)
{
int ret=c[k][j];
if(k-j&)ret=(mod-ret)%mod;
num t=x*y;
if(t==(num){,,})ans=ans+(num){n%mod*ret%mod,,};
else ans=ans+(num){ret,,}*(qpow(t,n+)-t)/(t-(num){,,});
x=x*A,y=y/B;
}
for(int j=;j<=k;j++)ans=ans/(num){,,};
return (ans.a+mod-)%mod;
}
int calf(ll n,int k)
{
if(!n)return ;
int ret=,sum;
for(int j=;j<=k;j++)
sum=1ll*F(n,j)*s[k][j]%mod,ret=(k-j&)?(ret-sum+mod)%mod:(ret+sum)%mod;
for(int i=;i<=k;i++)ret=1ll*ret*qpow(i,mod-)%mod;
return ret;
}
int G(ll n,int k)
{
if(!k)return n%mod;
num ans=(num){,,},x1=(num){,,},x2=(num){,mod-,};
num A=(num){,,},B=(num){,mod-,},x=(num){,,},y=x,a=x,b=x;
for(int j=;j<=k;j++)y=y*x2,b=b*B;
for(int j=;j<=k;j++)
{
int ret=c[k][j];
num t=x*y;
if(t==(num){,,})ans=ans+a*b*(num){n%mod*ret%mod,,};
else ans=ans+(num){ret,,}*a*b*(qpow(t,n+)-t)/(t-(num){,,});
x=x*x1,y=y/x2,a=a*A;b=b/B;
}
for(int j=;j<=k;j++)ans=ans/(num){,,};
return ans.a;
}
int calg(ll n,int k)
{
if(!n)return ;
n/=;
int ret=,sum;
for(int j=;j<=k;j++)
sum=1ll*G(n,j)*s[k][j]%mod,ret=(k-j&)?(ret-sum+mod)%mod:(ret+sum)%mod;
for(int i=;i<=k;i++)ret=1ll*ret*qpow(i,mod-)%mod;
return ret;
}
int main()
{
for(int i=;i<=;i++)
{
c[i][]=;
for(int j=;j<=i;j++)c[i][j]=(c[i-][j]+c[i-][j-])%mod;
}
s[][]=;
for(int i=;i<=;i++)
for(int j=;j<=i;j++)
s[i][j]=(s[i-][j-]+1ll*(i-)*s[i-][j])%mod;
int T,m;scanf("%d%d",&T,&m);
while(T--)
{
ll l,r;int k;cin>>l>>r>>k;
int ans=m==?(calf(r,k)-calf(l-,k)+mod)%mod:(calg(r,k)-calg(l-,k)+mod)%mod;
ans=1ll*ans*qpow((r-l+)%mod,mod-)%mod;
printf("%d\n",ans);
}
}
[BJOI2019]勘破神机(斯特林数+二项式定理+数学)的更多相关文章
- LOJ 3090 「BJOI2019」勘破神机——斯特林数+递推式求通项+扩域
题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...
- [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)$,下降幂转化成阶乘幂,这样都是多项式了, ...
- 题解 P5320 - [BJOI2019]勘破神机(推式子+第一类斯特林数)
洛谷题面传送门 神仙题(为什么就没能自己想出来呢/zk/zk) 这是我 AC 的第 \(2\times 10^3\) 道题哦 首先考虑 \(m=2\) 的情况,我们首先可以想到一个非常 trivial ...
- [BJOI2019]勘破神机(第一类斯特林数,斐波那契数列)
真的是好题,只不过强行多合一有点过分了…… 题目大意: $T$ 组数据.每个测试点中 $m$ 相同. 对于每组数据,给定 $l,r,k$,请求出 $\dfrac{1}{r-l+1}\sum\limit ...
- luogu P5320 [BJOI2019]勘破神机
传送门 首先我们要知道要求什么.显然每次放方块要放一大段不能从中间分开的部分.设\(m=2\)方案为\(f\),\(m=3\)方案为\(g\),\(m=2\)可以放一个竖的,或者两个横的,所以\(f_ ...
- #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 ...
- 【LOJ】#3090. 「BJOI2019」勘破神机
LOJ#3090. 「BJOI2019」勘破神机 为了这题我去学习了一下BM算法.. 很容易发现这2的地方是\(F_{1} = 1,F_{2} = 2\)的斐波那契数列 3的地方是\(G_{1} = ...
- [Luogu5320][BJOI2019]堪破神机(DP+斯特林数)
https://www.cnblogs.com/cjyyb/p/10747543.html 特征方程+斯特林反演化简式子,要注意在模998244353意义下5没有二次剩余,所以每个数都要用$a+b\s ...
随机推荐
- Python Django对接企业微信第三方服务回调验证的一些坑
今天公司老总,叫我把公司的企业微信,服务商管理后台中的本地应用进行回调验证. 听起来一脸懵逼,没搞过企业微信对接情况.一头雾水,不知道如何下手. 先讲解一下,企业微信情况. 登录到企业微信后,右上角服 ...
- MySQL InnoDB下关于MVCC的一个问题的分析
这个是网友++C++在群里问的一个关于MySQL的问题,本篇文章实验测试环境为MySQL 5.6.20,事务隔离级别为REPEATABLE-READ ,在演示问题前,我们先准备测试环境.准备一个测 ...
- 线程池工厂方法newFixedThreadPool()和newCachedThreadPool()
newFixedThreadPool()方法: 该方法返回一个固定数量的线程池,当一个新的任务提交时,线程池中若有空闲线程,则立即执行. 若没有.则新的任务被暂存在一个任务队列中,待线程空闲时,便处理 ...
- applicationSettings设置和appsttings
applicationSettings 可以和sttings一样在配置文件中,设置参数.支持定义参数的类型“serializaAs=string”,并可以使用 . 语法. 可以使用.语法
- Flink流处理的时间窗口
Flink流处理的时间窗口 对于流处理系统来说,流入的消息是无限的,所以对于聚合或是连接等操作,流处理系统需要对流入的消息进行分段,然后基于每一段数据进行聚合或是连接等操作. 消息的分段即称为窗口,流 ...
- .NET平台下,初步认识AutoMapper
初步认识AutoMapper AutoMapper 初步认识AutoMapper 前言 手动映射 使用AutoMapper 创建映射 Conventions 映射到一个已存在的实例对象 前言 通常 ...
- robot中简单的使用键盘按键,和对象无关
参考链接: https://blog.csdn.net/smallsmallmouse/article/details/78689675 1.在python中的代码 from selenium imp ...
- bsxfun
By HYB bsxfun(fun,A,B)偶然间发现了这个函数,强大得不得了呀,它的作用是:对两个矩阵A和B之间的每一个元素进行指定的计算(函数fun指定):并且具有自动扩维的作用 例如,A是一个4 ...
- 看门狗芯片--SP706SEN--调试记录
一.前因后果 工程中,设备为了稳定可靠,会增加外部看门狗,但是外部看门狗一旦启动,就停不下来,必须在固定的时间范围内进行喂狗,不然看门狗芯片就会产生一个复位信号复位MCU.以前大家都认为看门狗一旦工作 ...
- PWC6345: There is an error in invoking javac. A full JDK (not just JRE) is required
今天在使用jetty运行一个项目的时候报这个错误,仔细看了下,应该是eclipse配置的jdk或者jre出错. 看了下环境变量,发现有些配置没有配置完全. 我个人的解决方法: 在path中,添加%JA ...