逆元 适用 mod 为素数
C(n, m) 函数适用 n, m 在 1kw 以下时
n 过大时可暴力 均过大用 lucas定理
小于等于 k 种颜色 k * (k - 1) ^ (n - 1)
减去 (k - 1) * (k - 2) ^ (n - 1) * (不选的 k 种可能颜色)
有重复减去的部分
选 i 种颜色的情况数为 C(k, i)
#include <bits/stdc++.h>
#define ll long long
const long long mod = 1e9 + 7;
using namespace std;
ll Pow(ll a, ll b) // 快速幂
{
ll ans = 1;
ll t = a;
while (b != 0)
{
if (b & 1)
ans = (ans * t) % mod;
t = (t * t) % mod;
b >>= 1;
}
return ans;
}
/// C(n, m) 组合数函数
ll fac[1000005], inv[1000005], num[1000005];
void init(int p)
{
fac[0] = 1;
for (int i = 1; i <= p; i++)
fac[i] = fac[i - 1] * i % mod;
inv[p] = Pow(fac[p], mod-2);
for (int i = p - 1; i >= 0; i--)
inv[i] = inv[i &#