官方推导公式:
∑0≤k1,k2,⋯km≤n∏1≤j<m(kjkj+1)
=∑0≤k1≤k2≤⋯≤km≤n∏1≤j<m(kjkj+1)
=∑km=0n∑km−1=0km⋯∑k1=0k2∏1≤j<m(kjkj+1)
=∑km=0n{(km−1km)∑km−1=0km{(km−2km−1)⋯∑k1=0k2(k1k2)}}
=∑km=0n{(km−1km)∑km−1=0km{(km−2km−1)⋯∑k1=0k2(k1k2)}}
=∑km=0n{(km−1km)∑km−1=0km{(km−2km−1)⋯∑k2=0k3(k2k3)2k2}}
=∑km=0nmkm
=m−1mn+1−1
自己找的规律是求:ans=m^0+m^1+m^2+...+m^n,也就是等比数列的前n+1项和
/*by*/ #include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; typedef long long LL; const LL N=2010; const LL mod=1000000007; const LL INF=0x3f3f3f; LL quickpow(LL m, LL n) { LL b = 1; while(n > 0) { if(n & 1) b = (b * m) % mod; n = n >> 1 ; m = (m * m) % mod; } return b; } int main() { int T; cin>>T; while(T--) { LL n,m; scanf("%lld%lld",&n,&m); LL ans=0; ans=quickpow(m,n+1)-1; ans=ans*quickpow(m-1,mod-2)%mod;/*求逆元*/ printf("%lld ",ans%mod); } return 0; }