题目大意
给出一个长度为 n n n的空序列,有 m m m种数即 [ 1 , m ] [1,m] [1,m]填到这 n n n个位置上,定义一个数 a i a_i ai的下一个数 a j a_j aj对整个序列的贡献为:
- 若 a i = a j a_i=a_j ai=aj,贡献为 0 0 0
- 若 a i < a j a_i<a_j ai<aj,贡献为 1 1 1
- 若 a i > a j a_i>a_j ai>aj,贡献为 2 2 2
求出所有方案的序列的贡献之和。
解题思路
#include <bits/stdc++.h>
using namespace std;
#define ENDL "\n"
typedef long long ll;
typedef pair<int, int> pii;
const int maxn = 1e5 + 10;
const int Mod = 1e9 + 7;
int t;
ll qkp(ll x, ll n, ll p) {
ll ans = 1;
x %= p;
while (n) {
if (n & 1) ans = ans * x % p;
x = x * x % p;
n >>= 1;
}
return ans;
}
ll inv(ll a, ll p) { return qkp(a, p - 2, p); }
int main() {
// ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
ll n, m;
scanf("%d", &t);
while (t--) {
scanf("%lld%lld", &n, &m);
ll ans = qkp(m, n - 2, Mod);
ans = ans * (n - 1) % Mod * m % Mod * (3 * m - 3) % Mod * inv(2, Mod) % Mod;
printf("%lld\n", ans);
}
return 0;
}