k = 1, 有n种方案,k = n时,有m^n种填数方案
可以把每次填数视为上图中的一条从1到n的路径(注意:一条边可能会走多次, 但是从n-1到n的边只会走一遍)
可以算出从1到2的兴奋度总和为3 * m * (m - 1) / 2, 但是总共要走m ^ (n - 2)遍
同样的,可以算出从2到3的兴奋度为3 * m * (m - 1) / 2 * m, 但是只要走m ^ (n - 3) 遍
那么是否可以发现:从1到2总兴奋度 = 从2到3总兴奋度 = ... = 从n - 1到n的总兴奋度
是对的,因为相邻两层之间(k层, k + 1层), k + 1层的路径是k层的m倍,但是要走的遍数是k层的1/m
故最终答案就是[3 * m * (m - 1) * m / 2 ^ ( n - 2)] * (n - 1)
下面是代码
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
typedef long long LL;
const int mod = 1e9 + 7;
LL p(LL n, LL m)
{
LL res = 1;
while(m)
{
if(m & 1) res = (res * n) % mod;
n = n * n % mod;
m >>= 1;
}
return res;
}
int main ()
{
int T;
scanf("%d", &T);
while(T --)
{
LL n, m;
scanf("%lld%lld", &n, &m);
LL ans = m * (m - 1) / 2 % mod;
ans = ans * 3 % mod * (n - 1) % mod;
ans = ans * p(m, n - 2) % mod;
printf("%lld\n", ans);
}
return 0;
}

京公网安备 11010502036488号