ZZULIOJ 2826: 使用技能 #include<stdio.h> typedef long long LL; const int N = 100010, MOD = 1e9+7; LL fact[N],infact[N]; int C(int a,int b){return fact[a]*infact[b]%MOD*infact[a-b]%MOD;} int ksm(int a,int b) { int res=1; for(;b;b>>=1) { if(b&1) res=(LL)res*a%MOD; a=(LL)a*a%MOD; } return res; } int main() { fact[0]=1; for(int i=1;i<=100001;i++) fact[i]=fact[i-1]*i%MOD; infact[100001]=ksm(fact[100001],MOD-2); for(int i=100000;i>=0;i--) infact[i]=infact[i+1]*(i+1)%MOD; int T;scanf("%d",&T); while(T--) { int n,m;scanf("%d%d",&n,&m); LL ans=0; for(int i=1;i<=n;i++) { ans+=(LL)C(n,i)*i%MOD*i%MOD*m%MOD*ksm(m-1,n-i)%MOD; ans%=MOD; } ans=ans*ksm(ksm(m,n),MOD-2)%MOD; printf("%lld\n",ans); } return 0; }