Submission
Status:
[PPPPPPPPPP][PPPPPPPP]
Subtask/Task Score:
{50/50}{50/50}
Score: 100
User: Mingyuanz
Problemset: Tiles
Language: cpp
Time: 0.018 second
Submitted On: 2025-07-13 11:35:23
#include <bits/stdc++.h>
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,popcnt,lzcnt,bmi,bmi2")
#define pb push_back
#define pii pair<int,int>
#define f first
#define s second
#define INF (int)2e18
#define MOD (int)(1e9+7)
#define MAXN 200005
#define enl '\n'
#define DB(CODE) cout<<'\t'<<CODE<<'\n';
#define SP <<' '<<
#define int long long
#define mat vector<vector<int>>
#define newmat(n,m) vector<vector<int>>(n,vector<int>(m))
#define sz(v) (int)v.size()
#define printmat(A) for(auto x:A){for(auto y:x)cout<<y<<" ";cout<<'\n';}
typedef long long ll;
using namespace std;
mat matpow(mat &A,int n){
if(n==1) return A;
mat P=matpow(A,n/2);
mat B=newmat(3,3);
for(int i=0; i<3; i++) for(int j=0; j<3; j++) for(int k=0; k<3; k++) B[i][j]=(B[i][j]+P[i][k]*P[k][j]%MOD)%MOD;
if(n%2){
P=newmat(3,3);
for(int i=0; i<3; i++) for(int j=0; j<3; j++) for(int k=0; k<3; k++) P[i][j]=(P[i][j]+B[i][k]*A[k][j]%MOD)%MOD;
return P;
} return B;
}
void testcase(){
int n,k;
cin >> n >> k;
k%=MOD;
if(n==0) return (void)(cout << 1 << enl);
if(n==1) return (void)(cout << 1 << enl);
if(n==2) return (void)(cout << (1+k)%MOD << enl);
mat A={{1,k%MOD,2*k%MOD},{1,0,0},{0,1,0}};
mat X={{(1+k)%MOD},{1},{1}};
mat P=matpow(A,n-2);
cout << ((P[0][0]*X[0][0]%MOD+P[0][1]*X[1][0]%MOD)%MOD+P[0][2]*X[2][0]%MOD)%MOD << enl;
}
signed main(){
cin.tie(0)->sync_with_stdio(false);
int t=1;
cin >> t;
while(t--){
testcase();
}
return 0;
}