Submission

Status:

[-SSSSSSSSS][SSSSSSSS]

Subtask/Task Score:

{0/50}{0/50}

Score: 0

User: njoop

Problemset: Tiles

Language: cpp

Time: 0.002 second

Submitted On: 2025-07-10 17:18:22

#include <bits/stdc++.h>
#define int long long
#define vvi vector<vector<int>>
using namespace std;

vvi mat, val, id;
int mod = 1e9+7;

vvi mul(vvi a, vvi b) {
    int axsz = a.size();
    int aysz = a[0].size();
    int bxsz = b.size();
    int bysz = b[0].size();
    vvi out;
    if(aysz != bxsz) {
        cout << "Matrix can't be multiplied";
        exit(0);
    } 
    out.assign(axsz, vector<int>(bysz, 0));
    for(int i=0; i<axsz; i++) {
        for(int j=0; j<bysz; j++) {
            for(int k=0; k<aysz; k++) {
                out[i][j] += a[i][k] * b[k][j];
                out[i][j] %= mod;
            } 
        }
    }
    return out;
}

vvi pow(vvi val, int exp) {
    vvi cmat = val;
    val = id;
    while(exp > 0) {
        if(exp % 2 == 1) {
            val = mul(val, cmat);
        }
        exp /= 2;
        cmat = mul(cmat, cmat);
    }
    return val;
}

void solve() {
    int n, k;
    cin >> n >> k;
    k %= mod;
    id = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};
    mat = {{1, k, 2*k}, {1, 0, 0}, {0, 1, 0}};
    val = {{2*k}, {1}, {1}};
    vvi ans = mul(pow(mat, n), val);
    cout << ans[2][0] << "\n";
}

signed main() {
    int q;
    cin >> q;
    while(q--) {
        solve();
    }
}