题意: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]勘破神机(斯特林数+二项式定理+数学)的更多相关文章

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

    题目:https://loj.ac/problem/3090 题解:https://www.luogu.org/blog/rqy/solution-p5320 1.用斯特林数把下降幂化为普通的幂次求和 ...

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

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

  3. [BJOI2019]勘破神机

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

  4. 题解 P5320 - [BJOI2019]勘破神机(推式子+第一类斯特林数)

    洛谷题面传送门 神仙题(为什么就没能自己想出来呢/zk/zk) 这是我 AC 的第 \(2\times 10^3\) 道题哦 首先考虑 \(m=2\) 的情况,我们首先可以想到一个非常 trivial ...

  5. [BJOI2019]勘破神机(第一类斯特林数,斐波那契数列)

    真的是好题,只不过强行多合一有点过分了…… 题目大意: $T$ 组数据.每个测试点中 $m$ 相同. 对于每组数据,给定 $l,r,k$,请求出 $\dfrac{1}{r-l+1}\sum\limit ...

  6. luogu P5320 [BJOI2019]勘破神机

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

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

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

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

  9. [Luogu5320][BJOI2019]堪破神机(DP+斯特林数)

    https://www.cnblogs.com/cjyyb/p/10747543.html 特征方程+斯特林反演化简式子,要注意在模998244353意义下5没有二次剩余,所以每个数都要用$a+b\s ...

随机推荐

  1. HTTP与HTTPS介绍

    文章大纲 一.HTTP和HTTPS的基本概念二.HTTP缺点三.HTTPS介绍四.免费HTTPS证书推荐   一.HTTP和HTTPS的基本概念 HTTP:是互联网上应用最为广泛的一种网络协议,是一个 ...

  2. Nodejs 操作 Sql Server

    Nodejs 操作 Sql Server Intro 最近项目需要爬取一些数据,数据有加密,前端的js又被混淆了,ajax请求被 hook 了,有些复杂,最后打算使用 puppeteer 来爬取数据. ...

  3. angular部署到iis出现404解决方案

    angular应用部署在iis上,刷新出现404 解决方案: 安装 iis URL Rewrite 模块,并在 src 目录下增加web.config,配置urlrewrite如下: <conf ...

  4. CentOS 7下使用Gitolite搭建Git私服

    1. 搭建环境 CentOS7, git version 1.8.3.1 2. 安装依赖包 yum install curl-devel expat-devel gettext-devel opens ...

  5. VS根据数据库生成实体类

    一.在类库项目上添加新项 二. 三.依次填入数据库连接 选择数据库 就可以生成数据库实体

  6. 连接到 PostgreSQL 数据源(SQL Server 导入和导出向导)

    本主题向你介绍如何从 SQL Server 导入和导出向导的“选择数据源”页或“选择目标”页连接到 PostgreSQL 数据源. 重要 连接到 PostgreSQL 数据库的详细需求和先决条件不在此 ...

  7. 【PAT】B1014 福尔摩斯的约会

    因为前面两字符串中第 1 对相同的大写英文字母(大小写有区分)是第 4 个字母D,代表星期四: 第 2 对相同的字符是 E ,那是第 5 个英文字母,代表一天里的第 14 个钟头(于是一天的 0 点到 ...

  8. HBase源码实战:BufferedMutator

    /** * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agr ...

  9. spring上下文和springMVC上下文的关系

    查看原文

  10. Java中的CAS原理

    前言:在对AQS框架进行分析的过程中发现了很多CAS操作,因此有必要对CAS进行一个梳理,也便更清楚的了解其原理. 1.CAS是什么 CAS,是compare and swap的缩写,中文含义:比较交 ...