zoukankan      html  css  js  c++  java
  • ZROI1119 【十一·联考】幸福

    ZROI1119 【十一·联考】幸福

    传送门

    一道矩阵快速幂。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define ll long long
    #include<cmath>
    const int mod=998244353;
    using namespace std;
    struct matrix {
        ll data[7][7];
        void clear() {
            //for(int i=1;i<=5;i++)for(int j=1;j<=5;j++)data[i][j]=0;
            memset(data,0,sizeof(data));
        }
    };
    inline matrix operator * (matrix &a,matrix &b) {
        static matrix ans;ans.clear();
        for(int i=1;i<=5;i++) {for(int j=1;j<=5;j++) {for(int k=1;k<=5;k++) {ans.data[i][j]+=a.data[k][j]*b.data[i][k];ans.data[i][j]%=mod;}}}
        return ans;
    }
    matrix blank,re,E;
    void init() {
        //re_n=2
        for(int i=1;i<=5;i++)E.data[i][i]=1;
        re.data[1][1]=1;
        re.data[2][1]=2;
        re.data[3][1]=1;
        re.data[4][1]=1;
        re.data[5][1]=3;
        blank.data[1][2]=1;blank.data[2][1]=1;blank.data[2][2]=1;blank.data[2][3]=1;blank.data[2][4]=1;blank.data[3][4]=1;
        blank.data[4][3]=1;blank.data[4][4]=1;blank.data[5][1]=1;blank.data[5][2]=1;blank.data[5][3]=1;blank.data[5][4]=1;blank.data[5][5]=1;
    };
    ll n;
    matrix ksm(ll time) {
        matrix ans,cur;ans.clear();ans=E;cur=blank;
        for(;time;time>>=1,cur=cur*cur){
            if(time&1)ans=ans*cur;
        }
        return ans;
    }
    int main() {
        init();
        scanf("%lld",&n);
        if(n==1){printf("3");return 0;}
        matrix add=ksm(n-1);
        add=re*add;
        printf("%lld",add.data[5][1]);
        return 0;
    }
    

  • 相关阅读:
    python_控制台输出带颜色的文字方法
    Django 知识总结(一)
    C# 实现俄罗斯方块
    一起学SpringMVC之Request方式
    一起学SpringMVC之RequestMapping详解
    一起学SpringMVC之Json
    一起学SpringMVC之注解
    一起学SpringMVC之入门篇
    一起学Android之Xml与Json解析
    一起学Android之AsyncTask
  • 原文地址:https://www.cnblogs.com/GavinZheng/p/11615658.html
Copyright © 2011-2022 走看看