Submission

Status:

[PPPPPPPPPP][PPPPPPPP]

Subtask/Task Score:

{50/50}{50/50}

Score: 100

User: Dormon

Problemset: Tiles

Language: cpp

Time: 0.032 second

Submitted On: 2025-07-10 18:50:19

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
using ll = long long;
const ll mod = 1e9 + 7;

struct Matrix {
    vector<vector<ll>> a;
    int row, col;
    Matrix(int n, int m) : row(n), col(m), a(n, vector<ll>(m, 0ll)) {}
    Matrix(int n) : Matrix(n, n) {}
    friend Matrix operator * (const Matrix &lhs, const Matrix &rhs){
        int n = lhs.row, m = lhs.col, o = rhs.col;
        Matrix res(n, o);
        for (int i = 0;i < n;i++)
            for (int j = 0;j < o;j++)
                for (int k = 0;k < m;k++)
                    res.a[i][j] = (res.a[i][j] + (lhs.a[i][k] * rhs.a[k][j]) % mod) % mod;
        return res;
    }
    friend ostream &operator << (ostream &out, const Matrix &o){
        int n = o.row, m = o.col;
        for (int i = 0;i < n;i++){
            for (int j = 0;j < m;j++)
                out << o.a[i][j] << ' ';
            out << '\n';
        }
        cout << string(10, '-') << '\n';
        return out;
    }
};

Matrix binpow(Matrix b, ll n){
    Matrix res(b.row);
    for (int i = 0;i < b.row;i++) res.a[i][i] = 1ll;
    while (n > 0ll){
        if (n & 1ll) res = res * b;
        b = b * b;
        n >>= 1ll;
    }
    return res;
}

void solve(){
    ll n, k;
    cin >> n >> k;
    k %= mod;
    if (n <= 3){
        vector<ll> ans = {1, k + 1ll, 4 * k + 1ll};
        cout << ans[n - 1] % mod << '\n';
        return ;
    }
    Matrix base(3);
    base.a[1][0] = base.a[2][1] = 1ll;
    base.a[0][2] = 2ll * k;
    base.a[1][2] = k;
    base.a[2][2] = 1ll;
    Matrix res(1, 3);
    res.a[0][0] = 1ll;
    res.a[0][1] = k + 1;
    res.a[0][2] = 4ll * k + 1;
    Matrix dp = binpow(base, n - 3);
    Matrix ans = res * dp;
    cout << ans.a[0][2] << '\n';
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);

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