记录编号 584688 评测结果 AAAAAAAAAA
题目名称 铺路 最终得分 100
用户昵称 Gravatar┭┮﹏┭┮ 是否通过 通过
代码语言 C++ 运行时间 0.007 s
提交时间 2023-11-14 16:51:01 内存使用 1.15 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//递推 + 矩阵快速幂 
const int mod = 1e9+7;
int t,n;
ll c[6][6];
ll f[6];// 

ll ct[6][6] = {{1,1,0,0,0},{1,0,0,0,0},{2,0,1,0,0},{2,0,1,1,1},{0,0,0,1,0}};
ll ft[6] = {2,0,1,1,1};//初始矩阵 
void first(){
    memcpy(f,ft,sizeof(ft));
    memcpy(c,ct,sizeof(ct));
}// 
void mul(ll x[6],ll y[6][6]){
    ll a[6] = {0};
    for(int j = 0;j < 5;j++){
        for(int k = 0;k < 5;k++){
            a[j] = (a[j] + (x[k] * y[k][j]) % mod) % mod;
        }
    }
    memcpy(x,a,sizeof(a));
} 
void mulself(ll x[6][6]){
    ll a[6][6] = {0};
    for(int i = 0;i < 5;i++){
        for(int j = 0;j < 5;j++){
            for(int k = 0;k < 5;k++){
                a[i][j] = (a[i][j] + (x[i][k] * x[k][j]) % mod) % mod;
            }
        }
    }
    memcpy(x,a,sizeof(a));
}
int main(){
    freopen("obsession.in","r",stdin);
    freopen("obsession.out","w",stdout);
    scanf("%d",&t);
    while(t--){
        first();
        scanf("%d",&n);
        if(n == 1 || n == 2){
            printf("0\n");
            continue;
        }
        int k = n-3;//
        while(k){
            if(k & 1)mul(f,c);
            mulself(c);
            k >>= 1;
        }//快速幂 
        printf("%lld\n",f[0]);
    }
    
    
    return 0;
    
}