牛客挑战赛32C 斐波那契数列卷积 解题报告

斐波那契数列卷积

http://www.nowcoder.com/questionTerminal/43a2cc2f5d7347e699ad8ab1a7ecbee3

观察题目给出的条件,很容易就可以得出如下式子:

表示该数列的第项,则有

而这个式子我们可以通过构造矩阵来快速计算第

接下来讲一下如何构造矩阵:

我们设一个的矩阵,使得矩阵满足如下条件

这样我们很容易就能构造出这个矩阵

也就是说,我们最终要求的答案就是

只需要写一个矩阵快速幂即可,注意到计算结果和结果矩阵中的第行第列相同,直接输出即可,因为矩阵中存在负数,取模时应先加上

代码:

//Copyright (c) 2019 by xiao_mmQF. All Rights Reserved.
#include<bits/stdc++.h>
#define int __int128
#pragma GCC optimize(3)
#define inl inline
#define reg register
#define db long double
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
inl int read(){ int x=0,f=0; char ch=0; while(!isdigit(ch))f|=(ch=='-'),ch=getchar(); while(isdigit(ch))(x*=10)+=(ch^48),ch=getchar(); return f?-x:x; }
inl void Ot(reg int x) { if(x<0)putchar('-'),x=-x; if(x>=10)Ot(x/10); putchar(x%10+'0'); }
inl void Print(reg int x,char til='\n'){Ot(x);putchar(til);}
inl int Max(reg int x,reg int y){return x>y?x:y;}
inl int Min(reg int x,reg int y){return x<y?x:y;}
inl int Abs(reg int x){return x<0?-x:x;}
const int MAXN=10010;
const int Mod=998244353;
struct Matrix{
    int a[4][4];
    void init(){
        a[0][0]=2;a[0][1]=1;a[0][2]=0;a[0][3]=0;
        a[1][0]=1;a[1][1]=0;a[1][2]=1;a[1][3]=0;
        a[2][0]=-2;a[2][1]=0;a[2][2]=0;a[2][3]=1;
        a[3][0]=-1;a[3][1]=0;a[3][2]=0;a[3][3]=0;
//构造初始矩阵
    }
    Matrix operator*(const Matrix &rhs)const {
        Matrix ret;
        for(reg int i=0;i<4;i++)
        for(reg int j=0;j<4;j++)
        {
            ret.a[i][j]=0;
            for(reg int k=0;k<4;k++)
            ret.a[i][j]+=a[i][k]*rhs.a[k][j],ret.a[i][j]=(ret.a[i][j]+Mod)%Mod;
        }
        return ret;
//定义矩阵乘
    }
}A,B;
int n;
Matrix qpow(Matrix x,int y){
    y -- ;
    Matrix ans = x ;
    for( ; y  ; y >>= 1 , x = x * x)
        if(y & 1) ans = ans * x ;
    return ans;
}//矩阵快速幂
signed main() {
    n=read();
    A.init();
    B=qpow(A,n);
    // for(reg int i=0;i<4;i++,puts(""))
    // for(reg int j=0;j<4;j++)
    // Print(B.a[i][j],' ');
    Print(B.a[0][2]);
    return 0 ;
}
全部评论
d(n)是怎么推出来的呢😥
点赞 回复 分享
发布于 2019-09-21 21:46
具体怎么推出来,详细一点
点赞 回复 分享
发布于 2019-09-21 20:03

相关推荐

02-07 12:06
已编辑
华侨大学 测试开发
最近看到很多&nbsp;92&nbsp;的,甚至是硕士,开始往测开赛道卷,说实话有点看不懂。先把话说清楚,大厂里的测开,绝大多数时间干的还是测试的活,只是写点自动化脚本、维护测试平台、接接流水线,真正像开发一样做系统、做架构、做核心平台的测开少得可怜,基本都集中在核心提效组,而且人很少,外面进去的大概率轮不到你,我想真正干过人都清楚。很多人被洗脑了,以为测开也是开,和后端差不多,只是更简单、更轻松、还高薪。现实情况是,测开和开发的职业路径完全不一样。开发的核心是业务和系统能力,测开的核心是稳定性和覆盖率,前者是往上走,后者天花板非常明显。你可以见到很多开发转测开,但你很少见到干了几年测开还能顺利转回开发的。更现实一点说,92&nbsp;的高学历如果拿来做测开,大部分时间就是在做重复性很强的杂活,这种工作对个人能力的放大效应非常弱。三年下来,你和一个双非的,甚至本科的测开差距不会太大,但你和同龄的后端、平台开发差距会非常明显。这不是努不努力的问题,是赛道问题。所谓测开简单高薪,本质上是把极少数核心测开的上限,当成了整个岗位的常态来宣传。那些工资高、技术强的测开,本身就是开发水平,只是挂了个测开的名。普通人进去,99%&nbsp;做的都是项目兜底型工作,而不是你想象中的平台开发。测开不是不能做,但它绝对不是开发的平替,也不是性价比最优解。如果你是真的不想做开发,追求稳定,那测开没问题。但如果你只是觉得测开比后端容易,还能进大厂,那我劝你冷静一点,这只是在用短期安全感换长期天花板。有92的学历,如果你连测开这些重复性工作都能心甘情愿接受,那你把时间精力用在真正的开发、系统、业务深度上,回报大概率比卷测开要高得多。想清楚再下场,别被岗位名和话术带偏了,就算去个前端客户端也是随便占坑的,测开是一个坑位很少赛道,反而大面积学历下放,不用想也能知道会是什么结果,我想各位在JAVA那里已经看到了
小浪_Coding:工作只是谋生的手段 而不是相互比较和歧视
点赞 评论 收藏
分享
评论
7
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务