Help! Help!
查看原帖
Help! Help!
405146
Ruan_ji楼主2023/1/17 13:53

调了俩小时,一直输出0

无语了,感谢帮助~

#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 1e2;
const int mod = 1000000007;

int T;

struct mat {
    long long m, n, number[MAXN][MAXN];
    mat () {
        m = 0; n = 0;
        for (int i  = 1; i <= m; ++i)
            for (int j = 1; j <= n; ++j)
                number[i][j] = 0;
    }

    mat operator * (mat B) {
        mat answer;
        answer.m = m; answer.n = B.n;
        for (int i = 1; i <= answer.m; ++i) {
            for (int j = 1; j <= answer.n; ++j) {
                for (int k = 1; k <= n; ++k) {
                    answer.number[i][j] += number[i][k] % mod * B.number[k][j] % mod;
                    answer.number[i][j] %= mod;
                }
            }
        }
        return answer;
    }
};

mat fastpow (mat A, long long k) {
    mat answer;
    mat base = A;
    for (int i = 1; i <= answer.m; ++i)
        answer.number[i][i] = 1;

    while (k) {
        if (k & 1) answer = answer * base;
        base = base * base;
        k /= 2;
    }
    return answer;
}

int main () {
    mat T1, T2;
    T1.m = T1.n = 3;
    T1.number[1][1] = 1; T1.number[1][3] = 1;
    T1.number[2][1] = 1;
    T1.number[3][2] = 1;

    T2.m = 3; T2.n = 1;
    T2.number[1][1] = 1;
    T2.number[2][1] = 1;
    T2.number[3][1] = 1;


    cin >> T;
    for (int i = 1; i <= T; ++i) {
        int num; cin >> num;
        if (num <= 3) {
            cout << 1 << endl;
            continue;
        }

        mat answer;
        answer.m = 3; answer.n = 1;
        answer = fastpow (T1, num - 3) * T2;

        cout << answer.number[1][1] << endl;
    }
    return 0;
}

2023/1/17 13:53
加载中...