//Coder: Balajiganapathi #define TRACE #define DEBUG #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; typedef vector vi; typedef pair pi; typedef vector vs; // Basic macros #define st first #define se second #define all(x) (x).begin(), (x).end() #define ini(a, v) memset(a, v, sizeof(a)) #define re(i,s,n) for(int i=s;i<(n);++i) #define rep(i,s,n) for(int i=s;i<=(n);++i) #define fr(i,n) re(i,0,n) #define repv(i,f,t) for(int i = f; i >= t; --i) #define rev(i,f,t) repv(i,f - 1,t) #define frv(i,n) rev(i,n,0) #define pu push_back #define mp make_pair #define sz(x) (int)(x.size()) const int oo = 2000000009; const double eps = 1e-9; #ifdef TRACE #define trace1(x) cerr << #x << ": " << x << endl; #define trace2(x, y) cerr << #x << ": " << x << " | " << #y << ": " << y << endl; #define trace3(x, y, z) cerr << #x << ": " << x << " | " << #y << ": " << y << " | " << #z << ": " << z << endl; #define trace4(a, b, c, d) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << endl; #define trace5(a, b, c, d, e) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << endl; #define trace6(a, b, c, d, e, f) cerr << #a << ": " << a << " | " << #b << ": " << b << " | " << #c << ": " << c << " | " << #d << ": " << d << " | " << #e << ": " << e << " | " << #f << ": " << f << endl; #else #define trace1(x) #define trace2(x, y) #define trace3(x, y, z) #define trace4(a, b, c, d) #define trace5(a, b, c, d, e) #define trace6(a, b, c, d, e, f) #endif const ll mod = 1000000007; ll M, R; //Functions for performing modular operations ll add(ll a, ll b) { return (a + b) % mod; } ll sub(ll a, ll b) { return add(a, mod - b); } ll mult(ll a, ll b) { a %= mod; b %= mod; return a * b % mod; } ll expo(ll a, ll p) { a %= mod; ll ret = 1; for(; p; p /= 2) { if(p & 1) ret = mult(ret, a); a = mult(a, a); } return ret; } ll inv(ll a) { return expo(a, mod - 2); } ll divide(ll a, ll b) { a %= mod; b %= mod; return mult(a, inv(b)); } int main() { int t; cin >> t; while(t--) { cin >> M >> R; trace2(M, R); //See editorials for more details. The answer is //(M^R - 1) / (M - 1) - R ll ans = sub(expo(M, R), 1); ans = divide(ans, sub(M, 1)); ans = sub(ans, R); cout << ans << endl; } return 0; }