upd:20.04.27

orz EI

考虑把组合数拆成下降幂除掉阶乘

\(\sum_{i=0}^{n}\binom{f_i}{k}=\sum_{i=0}^{n}\frac{{f_i}^{\underline{k}}}{k!}=\frac{1}{k!}\sum_{i=0}^{n}{f_i}^{\underline{k}}\)

考虑算\(\sum_{i=0}^{n}{f_i}^{\underline{k}}\),带入通项公式\(f_i=\lambda_1\alpha^i+\lambda_2\beta^i\)

\(\sum_{i=0}^{n}{f_i}^{\underline{k}}=\sum_{i=0}^{n}(\lambda_1\alpha^i+\lambda_2\beta^i)^{\underline{k}}\)

\(=\sum_{i=0}^{n}\prod_{j=0}^{k-1}(\lambda_1\alpha^i+\lambda_2\beta^i-j)\)

注意到本题中在\(m=2\)时\(\alpha\beta=-1\),在\(m=3\)时\(\alpha\beta=1\)

所以先考虑\(m=3\),可得\(\beta=\alpha^{-1}\),代入得

\(=\sum_{i=0}^{n}\prod_{j=0}^{k-1}(\lambda_1\alpha^i+\lambda_2\alpha^{-i}-j)\)

设后面柿子展开后\((\alpha^i)^j\)前面系数为\(c_j\)

\(=\sum_{i=0}^{n}\sum_{j=-k}^{k}c_j(\alpha^i)^j\)

\(=\sum_{j=-k}^{k}c_j(\sum_{i=0}^{n}\alpha^{ij})\)

所以用分治fft算出\(c_j\)后就可以等比数列求和做了

还有\(m=2\)的情况,这时\(\alpha\beta=-1,\beta=-\alpha^{-1}\),代入后发现当\(i\)为奇数时\(\prod\)里面\(\lambda_2\)前面符号为负号,否则为正号,这时候分别算奇数偶数的答案即可.总复杂度\(O(k\log^2k+k\log n)\)

code


以下是原内容

传送门

首先我们要知道要求什么.显然每次放方块要放一大段不能从中间分开的部分.设\(m=2\)方案为\(f\),\(m=3\)方案为\(g\),\(m=2\)可以放一个竖的,或者两个横的,所以\(f_i=f_{i-1}+f_{i-2}\);\(m=3\),因为只有\(i\)为偶数有值,所以为了方便后面的\(i\)其实是原来的\(2i\),然后可以发现要么放三个横的,要么一横两竖,要么像下面这样放长度为偶数的块

|--|   ------
|--| |----|
---- |----|

注意到(原来的)长度为\(2\)有三种方案,其他的都有2种方案,所以\(g_i=3g_{i-1}+\sum_{j=2}^{i}2g_{i-j}\),打表可以发现其实是\(g_i=4g_{i-1}-g_{i-2}(g_1=3)\).因为要从某种长度中选\(k\)个,所以要求\((m=2)\sum_{i=l}^r \binom{f_i}{k}\).显然只要考虑\([1,r]\)和\([1,l-1]\)的值

\(k\)较小,我们可以把组合数看成一个\(k+1\)次项的多项式\(\binom{n}{k}=\frac{1}{k!}\prod_{i=0}^{k}(n-i)\),后面记第\(i\)项系数为\(s_i\),那么我们要求的是

\(\sum_{i=1}^n \sum_{j=0}^{k} s_j{f_i}^j\)

\(\sum_{j=0}^{k} s_j\sum_{i=1}^n{f_i}^j\)

后面那个东西不大好求,考虑我们已经知道递推式了,可以利用特征方程解出通项公式,可以去这里学,所以\(f\)的通项公式是自己去网上找,然后稍微改一下,\(g\)的公式是\(g_n=\frac{3-\sqrt{3}}{6}(2+\sqrt{3})^n+\frac{3+\sqrt{3}}{6}(2-\sqrt{3})^n\),后面为了方便,统一记为\(ab^n+cd^n\)

然后继续推式子

\(\sum_{j=0}^{k} s_j\sum_{i=1}^n(ab^i+cd^i)^j\)

二项式定理展开

\(\sum_{j=0}^{k} s_j\sum_{i=1}^n\sum_{l=0}^{j}\binom{j}{l} (ab^i)^l(cd^i)^{j-l}\)

\(\sum_{j=0}^{k} s_j\sum_{l=0}^{j}\binom{j}{l}\sum_{i=1}^n a^lb^ilc^{j-l}d^{i(j-l)}\)

\(\sum_{j=0}^{k} s_j\sum_{l=0}^{j}\binom{j}{l}a^lc^{j-l}\sum_{i=1}^n (b^ld^{j-l})^i\)

后面可以等比数列求和,然后直接做就行了

注意\(3\)和\(5\)在模\(998244353\)意义下没有二次剩余,所以把运算的数记为\(a+b\sqrt{c}\),然后写个类型,定义一下运算就好了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<vector>
#include<cmath>
#include<ctime>
#include<queue>
#include<map>
#include<set>
#define LL long long
#define db double using namespace std;
const int N=1000+20,mod=998244353;
LL rd()
{
LL x=0,w=1;char ch=0;
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*w;
}
int fpow(int a,int b){int an=1;while(b){if(b&1) an=1ll*an*a%mod;a=1ll*a*a%mod,b>>=1;} return an;}
int inv(int a){return fpow(a,mod-2);}
int kk,s[N],fac[N],iac[N],bs;
int C(int n,int m){return m<0||n<m?0:1ll*fac[n]*iac[m]%mod*iac[n-m]%mod;}
struct node
{
int a,b;
node(){a=b=0;}
node(int na,int nb){a=na,b=nb;}
node operator + (const node &bb) const {return node((a+bb.a)%mod,(b+bb.b)%mod);}
node operator - (const node &bb) const {return node((a-bb.a+mod)%mod,(b-bb.b+mod)%mod);}
node operator * (const node &bb) const {return node((1ll*a*bb.a+1ll*b*bb.b%mod*bs)%mod,(1ll*a*bb.b+1ll*b*bb.a)%mod);}
node operator * (const LL &bb) const {return node(1ll*a*bb%mod,1ll*b*bb%mod);}
node invv(){int dt=inv((1ll*a*a-1ll*bs*b*b%mod+mod)%mod);return node(1ll*a*dt%mod,(mod-1ll*b*dt%mod)%mod);}
node operator ^ (const LL &bb) const
{
node an,a=*this;
an.a=1;
LL bbb=bb;
while(bbb)
{
if(bbb&1) an=an*a;
a=a*a,bbb>>=1;
}
return an;
}
}a,b,c,d,yi;
node dbsl(node aa,LL n){return aa.a==1&&aa.b==0?node(n%mod,0):(yi-(aa^n))*((yi-aa).invv());}
int sov(LL n)
{
int an=0;
for(int j=0;j<=kk;++j)
{
node sm;
for(int l=0;l<=j;++l)
sm=sm+(a^l)*(c^(j-l))*(dbsl((b^l)*(d^(j-l)),n+1)-yi)*C(j,l);
an=(an+1ll*s[j]*sm.a%mod)%mod;
}
return 1ll*an*iac[kk]%mod;
} int main()
{
yi.a=1;
fac[0]=1;
for(int i=1;i<=N-10;++i) fac[i]=1ll*fac[i-1]*i%mod;
iac[N-10]=inv(fac[N-10]);
for(int i=N-10;i;--i) iac[i-1]=1ll*iac[i]*i%mod;
int T=rd(),op=rd();
if(op==2)
{
bs=5;
a=node(inv(2),inv(10)),b=node(inv(2),inv(2)),c=node(inv(2),mod-inv(10)),d=node(inv(2),mod-inv(2));
}
else
{
bs=3;
a=node(inv(2),mod-inv(6)),b=node(2,1),c=node(inv(2),inv(6)),d=node(2,mod-1);
}
while(T--)
{
LL l=rd(),r=rd(),ln=(r-l+1)%mod;kk=rd();
if(op==3) l=(l+1)/2+1,r=r/2+1;
memset(s,0,sizeof(int)*(kk+3));
s[0]=1;
for(int i=0;i<kk;++i)
{
for(int j=kk;j;--j) s[j]=(1ll*s[j]*(mod-i)%mod+s[j-1])%mod;
s[0]=1ll*s[0]*(mod-i)%mod;
}
printf("%lld\n",1ll*(sov(r)-sov(l-1)+mod)%mod*inv(ln)%mod);
}
return 0;
}

luogu P5320 [BJOI2019]勘破神机的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. socket.io 出现的WebSocket is closed before the connection is established

    WebSocket is closed before the connection is established 最近socket.io是挺流行的,幼麟棋牌和一些好的开源项目也使用这个框架,在搭建其平 ...

  2. 解决Jenkins运行robot framework selenium脚本不打开浏览器的问题

    1.总结就是,不能使用msi安装的jenkins,最好使用tomcat下的war包方式的jenkins 参考连接https://www.cnblogs.com/hotpsy/p/6907233.htm ...

  3. Namespace讨论

    我们需要讨论一个深层次的问题: 为什么不直接在 tape17162c5-00 和 tapd568ba1a-74 上配置 Gateway IP,而是引入一个 namespace,在 namespace ...

  4. VS2019 实用设置

    本文记录了 VS2019 预览版使用过程中的一些设置,这些设置也同样适用于 VS2017,我们可以根据个人的实际情况进行修改. 滚动条(Scroll Bar) 将滚动条设置为 map mode 后,则 ...

  5. 完全自主创建Wrapper Tomcat容器

    Wrapper Tomcat 使用说明1. Wrapper Tomcat 简介1) Wrapper Tomcat 是使用Apache Tomcat 整合 Java Service Wrapper 的一 ...

  6. Linux(Ubuntu)使用日记------Mongodb的安装与使用

    1.安装 Linux下安装mongodb还是比较容易的 直接使用apt-get安装即可,命令如下: sudo apt-get install mongodb 安装完成之后进行检验, “mongo sh ...

  7. flask 利用flask_wtf扩展 创建web表单

    在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能 创建语句格式: startTime = DateTimeField('计划开 ...

  8. 解决Windows10中Virtualbox安装虚拟机没有64位选项

    今天想在Windows 10系统安装完Virtualbox虚拟机,然后打算装一个CENTOS系统,但是选择安装系统的时候竟然没有64位操作系统的选项,经过一阵Google,终于解决了,在这里盘点一下出 ...

  9. JavaScript与C# Windows应用程序交互方法

    一.建立网页 <html> <head>       <meta http-equiv="Content-Language" content=&quo ...

  10. Oracle 12c 静默安装(脚本自动化)

    oracle 12C 自动化静默安装脚本 项目地址: github: https://github.com/spdir/oracle-single-install 下载安装脚本 wget https: ...