P1939 【模板】矩阵加速(数列)

P1939 【模板】矩阵加速(数列)

传送门

矩阵加速的难点就在于构造转移矩阵。

根据题目的提示显然我们的初始矩阵为

假设我们当前矩阵需要求的矩阵为

根据递推公式有

观察可得即为状态转移矩阵。

所以答案为

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+5,mod=1e9+7;
#define mst(a) memset(a,0,sizeof a)
ll n,t;
struct Mat{
    ll a[4][4];
    Mat operator * (const Mat & mat)const{ //重载乘号 
        Mat ans;
        memset(ans.a,0,sizeof ans.a);//初始化 
        for(int i=1;i<=3;i++)
            for(int j=1;j<=3;j++)
                for(int k=1;k<=3;k++)
                    ans.a[i][j]=(ans.a[i][j]+a[i][k]*mat.a[k][j]%mod)%mod;
        return ans; 
    }
}m;
Mat ksm(Mat m,ll x){ //矩阵快速幂板子 
     Mat ans;
     memset(ans.a,0,sizeof ans.a); 
     ans.a[1][1]=ans.a[2][2]=ans.a[3][3]=1;
     while(x){
          if(x&1) ans=m*ans;
          m=m*m;
          x>>=1;
     }
     return ans;
}
int main(){
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        if(n<=3){ //特判.防止n-3<=0. 
            puts("1");
            continue;
        }
    memset(m.a,0,sizeof m.a);
    m.a[1][1]=m.a[1][3]=m.a[2][1]=m.a[3][2]=1;//初始化 
     m=ksm(m,n-3);
     ll ans=(m.a[1][1]+m.a[2][1]+m.a[3][1])%mod;
     printf("%lld\n",ans);
    }
    return 0;
} 
全部评论

相关推荐

10-20 16:50
门头沟学院 Java
牛客68421677...:同是天涯沦落人啊,我也是26届0实习,不知道怎么办了
点赞 评论 收藏
分享
10-29 22:30
吉林大学 Java
同专业学长学姐,去互联网大厂的起薪&nbsp;15k+,去国企&nbsp;IT&nbsp;岗的也有&nbsp;12k+,就连去中小厂的都基本&nbsp;13k&nbsp;起步😤&nbsp;我投的传统行业技术岗,拼死拼活拿到&nbsp;1Woffer,本来还挺开心,结果逛了圈牛客直接破防,同是校招生,行业差距怎么就这么大啊!
喵喵喵6_6:应该哪里不对吧,大厂都是20k以上的,10k那种对于985本的学生基本就是点击一下过了笔试就送的,我前两天刚拿了一个11k,笔试完第2天就打电话了,非科班。坏消息是c++岗开这么低真是刷新认知了
校招生月薪1W算什么水平
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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