为什么?
查看原帖
为什么?
1420422
Lyzc0dr楼主2025/7/21 12:33

下面这段代码对应的 bas 的次数是 n-1,而非oiwiki上提到的 n-2,虽然使用的矩阵一样,但是为什么仍可以通过。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
struct M {
    int n, m;
    int mat[107][107];
    M() {
        memset(mat, 0, sizeof(mat));
    }
} bas, ori;
int n, T, m, MOD;
M mul(M a, M b) {//矩阵乘法
    M ans;
    ans.n = a.n, ans.m = b.m;
    for(int i = 1; i <= ans.n; i++) {
        for(int j = 1; j <= ans.m; j++) {
            for(int k = 1; k <= a.m; k++) {
                ans.mat[i][j] = (ans.mat[i][j] + 1ll * a.mat[i][k] * b.mat[k][j])% MOD;
            }
        }
    }
    return ans;
}
M qpow(M x, ll p) {//矩阵快速幂
    M ret;
    ret.n = ret.m = x.n;
    for(int i = 1; i <= x.n; i++) ret.mat[i][i] = 1;
    while(p) {
        if(p & 1) ret = mul(ret, x);
        p >>= 1;
        x = mul(x, x);
    }
    return ret;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    //初始化矩阵
    bas.n=bas.m=2;
    ori.n=1,ori.m=2;
    bas.mat[1][1]=bas.mat[1][2]=bas.mat[2][1]=1;
    ori.mat[1][1]=ori.mat[1][2]=1;
    cin >> T;
    while(T--) {
        cin >> n >> m;
        if(n <= 2) {
            cout << 1<< "\n";
        } else {
            MOD=1<<m;
            M ans=qpow(bas,n-1);
            ans=mul(ori,ans);
            cout<<ans.mat[1][1]%MOD<<"\n";
        }
    }
    return 0;
}
2025/7/21 12:33
加载中...