zoukankan      html  css  js  c++  java
  • Log Concave Sequences Gym

    长度为(n),且只有{0,1,2},并且满足(a_{i - 1}*a_{i + 2} ≤ a_{i}^2, i in[2, n - 1])

    首先进行打表发现
    三个序列里

    0 0 0
    0 0 1
    0 0 2
    0 1 0
    0 1 1
    0 1 2
    0 2 0
    0 2 1
    0 2 2
    1 0 0
    1 1 0
    1 1 1
    1 2 0
    1 2 1
    1 2 2
    2 0 0
    2 1 0
    2 2 0
    2 2 1
    2 2 2
    

    都是条件的,然后再后面加{0,1,2},那么就对于某一个序列,就是由前面的序列进行相加过来的

    那么也就是说可以设一个辅助矩阵进行优化即可

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #define ll long  long
    using namespace std;
    const int mod = 1e9 + 7;
    ll m[9][9] ={
        {1,0,0,1,0,0,1,0,0},
        {1,0,0,0,0,0,0,0,0},
        {1,0,0,0,0,0,0,0,0},
        {0,1,0,0,1,0,0,1,0},
        {0,1,0,0,1,0,0,0,0},
        {0,1,0,0,0,0,0,0,0},
        {0,0,1,0,0,1,0,0,1},
        {0,0,1,0,0,1,0,0,1},
        {0,0,1,0,0,1,0,0,1}
    };
    struct Matrix{//矩阵
        int n,m;
        ll a[9][9];
        Matrix(int x,int y):n(x),m(y){memset(a,0,sizeof(a));}
        Matrix operator * (const Matrix &b){
            Matrix ans(n,b.m);
            for(int i = 0; i < n; i++){
                for(int j = 0; j < b.m; j++){
                    for(int k = 0; k < m; k++){
                        ans.a[i][j] = (ans.a[i][j] + a[i][k] * b.a[k][j] % mod) % mod;
                    }
                }
            }
            return ans;
        }
    };
    Matrix ksm(Matrix a, ll b){//矩阵快速幂
        Matrix ans(a.n,a.m);
        int maxx = max(a.n, a.m);
        for(int i = 0; i < maxx; i++)ans.a[i][i] = 1;
        while(b){
            if(b & 1)ans = ans * a;
            a = a * a;
            b >>= 1;
        }
        return ans;
    }
    ll Fib(ll n){
        Matrix base(9, 9);
        for(int i = 0; i < 9; i++)
            for(int j = 0; j < 9;j++)
                base.a[i][j] = m[i][j];
        Matrix ans = ksm(base, n - 2);
        ll sum = 0;
        for(int i = 0 ; i < 9;i++)
            for(int j = 0; j < 9;j++)
                sum =( sum + ans.a[i][j] ) % mod;
        return sum;
    }
    int main(){
        ll n;
        scanf("%lld", &n);
        printf("%lld
    ", Fib(n));
        return 0;
    }
    
  • 相关阅读:
    jsp表单数据添加到数据库
    javaweb 复习随笔
    [组 原]
    [组 原]
    均方差、交叉熵及公式推导
    网络安全知识网站
    docker搭建渗透环境并进行渗透测试
    SQL注入之-DECLARE时间盲注
    Apache Flink Dashboard未授权访问导致任意Jar包上传漏洞
    Dnscat2实现DNS隐蔽隧道反弹Shell
  • 原文地址:https://www.cnblogs.com/Emcikem/p/13641097.html
Copyright © 2011-2022 走看看