m,n都是1e9的数据范围,直接解不太可能,试着打表看一下小数据,结果规律很明显
就是求 m^0 + m^1 + m^2 + ... + m^n 即一个q为m的等比数列求和。
/* ***********************************************
Author :angon
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define REP(i,k,n) for(int i=k;i<n;i++)
#define REPP(i,k,n) for(int i=k;i<=n;i++)
#define scan(d) scanf("%d",&d)
#define scann(n,m) scanf("%d%d",&n,&m)
#define mst(a,k) memset(a,k,sizeof(a));
#define LL long long
#define maxn 1005
#define mod 1000000007
const int M = 1000000007;
const int MAXN = 1000;
int C[MAXN+1][MAXN+1];
void Initial()
{
for(int i=0; i<=MAXN; ++i)
{
C[0][i] = 0;
C[i][0] = 1;
}
for(int i=1; i<=MAXN; ++i)
for(int j=1; j<=MAXN; ++j)
C[i][j] = (C[i-1][j] + C[i-1][j-1]) % M;
}
void get_g() //打表找规律
{
//int n=2;
Initial();
for(int n=0;n<10;n++)
{
int ans=0;
for(int m1=0;m1<=n;m1++)
{
for(int m2=0;m2<=n;m2++)
{
for(int m3=0;m3<=n;m3++)
{
for(int m4=0;m4<=n;m4++)
ans+=C[m3][m2]*C[m2][m1]*C[m4][m3];
}
}
}
printf("%d\n",ans);
}
}
LL power(LL x,LL n)
{
LL res=1;
while(n>0)
{
if(n & 1)
res=(res*x)%mod;
x=(x*x)%mod;
n >>= 1;
}
return res;
}
LL inv(int x) //mod 为质数
{
return power(x,mod-2)%mod;
}
LL sn(LL q,LL n) //等比数列求和
{
if(q==1) return n;
return (power(q,n)-1)*inv(q-1)%mod;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
//get_g();
int t;
scan(t);
while(t--)
{
LL n,m;
scanf("%I64d%I64d",&n,&m);
LL ans = sn(m,n+1);
printf("%I64d\n",(ans+mod)%mod);
}
return 0;
}