#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)-G(n-4),G(2)=3,G(0)=1$$

我们发现$G$只有偶数项有值(证明的话可以把网格黑白染色什么的来证明)

那么我们可以设$T(n)=G(2n)$

那么$T$服从以下递推式

$$T(n)=4T(n-1)-T(n-2),T(1)=1,T(0)=1$$

那么我们发现$F$和$G$是两个二阶常系数线性递推数列

根据特征方程和生成函数那一套理论,我们可以知道$F,T$都有这样的通项公式

$$C×A^n+B×D^n$$

考虑题目让我们算什么

$$\sum_{i=1}^{n}{F(i) \choose k}$$

众所周知,组合数是个$O(k)$阶的多项式,那么我们现在的问题就变成了快速求

$$\sum_{i=1}^{n}F(i)^k$$

那么稍微画一下式子就是

$$\sum_{i=1}^{n}(CA^i+DB^i)^k$$

暴力二项式定理展开

$$\sum_{i=1}^{n}\sum_{j=0}^{k}C^{j}A^{ij}D^{k-j}B^{i(k-j)}$$

稍微交换一下求和号

$$\sum_{j=0}^{k}C^{j}D^{k-j}\sum_{i=1}^{n}(A^{j}B^{k-j})^i$$

后面显然是个等比数列求和,可以$O(logn)$的算出

那么这题就做完了,复杂度$O(Tk^2logn)$

注意当$m=3$的时候,你需要将输入的区间缩一下,因为询问的是$G$但是我们的做法只能处理$T$

另外你可能需要将输入的区间加加减减,因为我们的公式一般认为$F(0)=1$

下面是简单的线性代数内容,是关于如何解出$A,B,C,D$的

对于F显然是fib数列的通项公式,你应该熟练的背过它

$$A=\frac{\sqrt{5}+1}{2}$$

$$B=\frac{\sqrt{5}-1}{2}$$

$$C=\frac{\sqrt{5}}{5}$$

$$D=-\frac{\sqrt{5}}{5}$$

对于$T$稍微解一下特征方程可以得到

$$A=2+\sqrt{3}$$

$$B=2-\sqrt{3}$$

那么我们令$T(1)=1,T(2)=1$,就可以通过待定系数法解出$C,D$来

可能涉及到$\sqrt{3}$的方程组会有点复杂,推荐的解法是

令$x=C+D,y=\sqrt{3}(C-D)$

然后你会发现方程组干净了很多,从而我们可以解出x和y来,借助x和y就可以还原C,D了

解得

$$C=\frac{3+\sqrt{3}}{6},D=\frac{3-sqrt{3}}{6}$$

最后一个问题是5和3在膜998244353剩余系下统统没有二次剩余

把每个数字表示成$r+v\sqrt{k}$的形式即可实现模意义复数,然后就能计算了

等比数列求和涉及除法,使用这种复数实现除法的时候用分母有理化推个式子就行了

// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
using namespace std;const int N=1e5+10;
typedef unsigned long long ll;const ll mod=998244353;
inline ll po(ll a,ll p){ll r=1;for(;p;p>>=1,a=a*a%mod)if(p&1)r=r*a%mod;return r;}
# define md(x) (x=(x>=mod)?x-mod:x)
ll sqr;
struct cmp
{
    ll r;ll v;
    cmp(ll R=0,ll V=0){r=R;v=V;}
    friend cmp operator +(cmp a,cmp b)
    {
        cmp c=cmp(a.r+b.r,a.v+b.v);
        md(c.r);md(c.v);return c;
    }
    friend cmp operator -(cmp a,cmp b)
    {
        cmp c=cmp(a.r+mod-b.r,a.v+mod-b.v);
        md(c.r);md(c.v);return c;
    }
    friend cmp operator *(cmp a,cmp b)
    {
        return cmp((a.r*b.r+sqr*a.v%mod*b.v)%mod,(a.r*b.v+b.r*a.v)%mod);
    }
    friend cmp operator /(cmp a,cmp b)
    {
        cmp c=a*cmp(b.r,mod-b.v);
        ll iv=((b.r*b.r+(mod-sqr)*b.v%mod*b.v))%mod;
        iv=po(iv,mod-2);
        (c.r*=iv)%=mod;(c.v*=iv)%=mod;
        return c;
    }
}A,B,C,D;int T;int m;
// fib(n) =(A^n-B^n)*C
inline cmp cpo(cmp a,ll p)
{
    cmp r=cmp(1,0);
    for(;p;p>>=1,a=a*a)if(p&1)r=r*a;return r;
}
ll ifac[N];ll c[1010][1010];ll sr1[1010][1010];
inline void pre()
{
    ifac[0]=1;ifac[1]=1;
    for(int i=2;i<N;i++)
        ifac[i]=(mod-mod/i)*ifac[mod%i]%mod;
    for(int i=1;i<N;i++)
        (ifac[i]*=ifac[i-1])%=mod;
    for(int i=0;i<1006;i++)
    {
        c[i][0]=c[i][i]=1;
        for(int j=1;j<i;j++)
            c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
    }
    sr1[0][0]=1;
    for(int i=0;i<1006;i++)
        for(int j=1;j<=i;j++)
            sr1[i][j]=(sr1[i-1][j-1]+(mod-i+1)*sr1[i-1][j])%mod;
    if(m==2)
    {
        ll iv2=(mod+1)/2;sqr=5;
        A=cmp(iv2,iv2);B=cmp(iv2,mod-iv2);
        C=cmp(0,po(5,mod-2));
        D=cmp(C.r,mod-C.v);
    }else
    {
        ll iv6=po(6,mod-2);sqr=3;
        A=cmp(2,1);B=cmp(2,mod-1);
        C=cmp(3*iv6%mod,(mod-1)*iv6%mod);
        D=cmp(C.r,mod-C.v);
    }
}
//mar <cmp> st;mar <cmp> trs;
inline cmp csum(cmp q,ll n)
{
    if(q.r==1&&q.v==0)
        return (cmp){(n+1)%mod,0};
    cmp res=cpo(q,n+1)-cmp(1,0);
    res=res/(q-cmp(1,0));
//  printf("q=%lld,%lld,res=%lld,%lld\n",q.r,q.v,res.r,res.v);
    return res;
}
inline ll cfibk(ll n,int k)
{
    cmp res=cmp(0,0);
    for(int j=0;j<=k;j++)
    {
        cmp q=cpo(A,k-j)*cpo(B,j);
        cmp xs=(cmp){c[k][j],0}*cpo(C,k-j)*cpo(D,j);
        res=res+xs*csum(q,n);
    }
    return res.r;
}
namespace solver2
{
    inline void solve()
    {
        ll l;ll r;int k;
        scanf("%lld%lld%d",&l,&r,&k);
        l++;r++;ll res=0;
        for(int i=1;i<=k;i++)
            (res+=(cfibk(r,i)+mod-cfibk(l-1,i))*sr1[k][i])%=mod;
        (res*=ifac[k])%=mod;
        (res*=po((r-l+1)%mod,mod-2))%=mod;
        printf("%lld\n",res);
    }
}
namespace solver3
{
    inline void solve()
    {
        ll l;ll r;int k;
        scanf("%lld%lld%d",&l,&r,&k);
        ll len=r-l+1;
        if(l&1)l++;l/=2;
        if(r&1)r--;r/=2;
        l++;r++;
        ll res=0;
        for(int i=1;i<=k;i++)
            (res+=(cfibk(r,i)+mod-cfibk(l-1,i))*sr1[k][i])%=mod;
        (res*=ifac[k])%=mod;
        (res*=po(len%mod,mod-2))%=mod;
        printf("%lld\n",res);
    }
}
int main()
{
    scanf("%d%d",&T,&m);
    pre();
    if(m==2)
        for(int z=1;z<=T;z++)
            solver2::solve();
    else
        for(int z=1;z<=T;z++)
            solver3::solve();
    return 0;
}

原文地址:https://www.cnblogs.com/sweetphoenix/p/10786178.html

时间: 2024-10-04 16:32:54

#loj3090 [BJOI2019] 勘破神机的相关文章

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(

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

真的是好题,只不过强行多合一有点过分了…… 题目大意: $T$ 组数据.每个测试点中 $m$ 相同. 对于每组数据,给定 $l,r,k$,请求出 $\dfrac{1}{r-l+1}\sum\limits_{n=l}^r\dbinom{f(n,m)}{k}\bmod 998244353$. 其中 $f(n,m)$ 表示用 $1\times 2$ 的骨牌(可以变成 $2\times 1$)填满 $n\times m$ 的网格的方案数. $1\le T\le 5,1\le l\le r\le 10^{

获取手机SD卡路径(国产神机多个SD卡)

通过系统的 Environment.getExternalStorageDirectory().getAbsoluteFile(); 只能得到系统的SD卡路径,对于对个SD卡的国产神机,想得到外部SD卡就无能为力了.   下面介绍一个编写的工具类,通过反射得到系统隐藏的得到所有挂载路径方法获取所有SD卡路径: package com.itheima.mobilesafe.utils; import java.lang.reflect.InvocationTargetException; impo

红米5/红米5 Plus逼出最强魅蓝Note6?降价后已成性价比神机

从品牌到产品命名,小米旗下的红米与魅族旗下的魅蓝似乎是一对天生的对手,如今小米即将发布千元全面屏的红米5/红米5 Plus,暂时没有全面屏手机推出的魅蓝也拿出了自己的应对策略,魅蓝的办法简单粗暴:直接降价. (魅蓝Note6) 今天上午,魅蓝手机官微宣布,魅蓝Note6全系进行降价,并且打出“与其伪全面屏,不如真拍照旗舰”的宣传语,其中3GB+16GB版售价降至899元,3GB+32GB版降至999元,4GB+32GB版将至1299元,4GB+64GB版降至1499元,其中降价幅度最大的3GB+

捕猎机是什么

特别功能:大功率遥控有猎物时自动声光指示报*,此时可以使用远程遥控装置,在10000-160000米范围内都可以自由控制机器断电停止或者继续工作.我们采用数控技术了,各项指标在同行领先技术之上,成为同行企业的标杆,其他企业竞相模仿,我们已经解决了其他企业诸如机器寿命短.力量不足.费电.容易损坏等严重问题.同时,这些技术也在我们生产的系列捕猎机中使用,同样取得了非常令人满意的效果. 机子工作的正常状态专业厂家生产质量有保证,强大库管系统订货下单后两小时即可走货.此机是用高压电击原理捕抓猎物,是市面

农业局

自传20.在合江地区农业局一----太洪蹲点 一九七五年六月一日我在合江地区农业局农业科工作进入第一年.妻子还在交通局秘书科工作身体健康下班回家忙着收拾锅碗杯盘.儿子离开合江幼儿园将进入附近的第六小学开始一年级学习日子.女儿仍然还是生活学习在合江幼儿园很是聪明可爱会唱会说会玩. 我刚去报到时的农业局地点在合江地区行政公署大楼的北一层楼.先分到农业科跟随老同志熟悉情况并对学大寨运动进行总体研究.农业科里两位和蔼可亲经验丰富的科长引起我的敬爱好感和尊重.我跟随大家到桦川县苏家店考察春耕收集情况发现问

伟大是熬出来的

目录 前言 引言  时间熬成伟大:领导者要像狼一样坚忍 第一章  内圣外王--领导者的心态修炼 1. 天纵英才的自信心 2. 上天揽月的企图心 3. 誓不回头的决心 4. 宠辱不惊的平常心 5. 换位思考的同理心 6. 激情四射的热心 第二章  日清日高--领导者的高效能修炼 7. 积极主动,想到做到 8. 合理掌控自己的时间和生命 9. 制定目标,马上行动 10. 要事第一,既见树又见林 11. 吾日三省吾身,不断更新自我 第三章  厚德载物--领导者的影响力修炼 12. 大肚能容的胸襟 13

般若与慈悲

在讨论空性的时候,我们发现我们是把自己的成见.观念和对事物的看法加在现象上,而不是如实去看事物.一旦我们能看穿自己的成见之障,我们就会明白那是不必要的迷惑作法——在经验上加柄,却未考虑到合适与否.换言之,成见是一种保证.当我们看到某物时,我们便立即为它命名.归类.但色即是空:它无需我们用分类的方式来令它本性俱现,或让它如实存在.色的本身是空无成见的. 但空亦是色.这是说在此解悟的阶段,我们太着重见到空无成见之色.我们想要证得这种慧见,好像见色为空是一种我们能强令自心办到的事.我们寻空,以致空也变

中国传世名画

中国传世名画 QQ空间 QQ好友 新浪微博 腾讯微博 推荐给朋友    中国传世名画  人物卷 新石器时期(001-002) 001 <人画鱼纹图> 002 <舞蹈纹彩陶盆> 战国(003-004) 003 <人物龙凤帛画> 004 <人物御龙帛画> 西汉(005-006) 005 <侯家属墓生活图> 006 <鸿门宴图> 007 <赵氏孤儿图> 东汉(008) 008 <乐舞百戏图> 东晋(009-012)