题意:根据题目所给公式打表找规律,容易发现
f(n,m)=m*f(n-1)+1
f(1,m)=m+1
容易得到
f(n,m)=(m^(n+1)-1)/(m+1)
套一个模逆元板子就好了
#include<bits/stdc++.h>
#define mod 1000000007
using namespace std;
long long extend_gcd(long long a,long long b,long long &x,long long &y)
{
if(a==0&&b==0) return -1;
if(b==0){x=1;y=0;return a;}
long long d=extend_gcd(b,a%b,y,x);
y-=a/b*x;
return d;
}
long long mod_rev(long long a,long long n)
{
long long x,y;
long long d=extend_gcd(a,n,x,y);
if(d==1) return (x%n+n)%n;
else return -1;
}
long long qpow(long long x,long long y) {
long long ans=1;
long long tt=x;
while(y) {
if(y&1) {
ans*=tt;
ans%=mod;
}
tt*=tt;
tt%=mod;
y/=2;
}
return ans;
}
int main()
{
long long n,m;
int t;
scanf("%d",&t);
while(t--) {
scanf("%lld%lld",&n,&m);
long long a=qpow(m,n+1);
a=(a-1+mod)%mod;
// cout <<"=="<< a << endl;
long long ans=a*mod_rev(m-1,mod)%mod;
printf("%lld\n",ans);
}
return 0;
}