题解:P12181 DerrickLo's Buildings (UBC002D)
我们可以对
因为
-
\sum_{k=1}^V\left(\sum_{v \text{ is a permutation of }[M]}\sum_{j=1}^N[v_k(j) = j]\right) -
\sum_{k=1}^V\left(\sum_{v \text{ is a permutation of }[M]}\sum_{j=1}^N[v_k(j) = 2j]\right)
由期望的线性性,所有合理范围内的
第一个式子
定义排列
那么,当
则,我们可以枚举环长
除去
第二个式子
我们只需要
当
当
更新:有个式子写错了。
std
#include <iostream>
using namespace std;
#define MOD 998244353ll
using ll = long long;
ll pow(ll b, ll p, ll m)
{
b %= MOD;
ll r = 1;
while (p)
{
if (p & 1)
{
r = r * b % m;
}
b = b * b % m;
p >>= 1;
}
return r;
}
ll inv(ll p)
{
return pow(p, MOD - 2, MOD);
}
int main()
{
int t;
cin >> t;
while (t--)
{
ll n, m, v;
cin >> n >> m >> v;
ll s = 0;
for (ll l = 1, r; l <= m && l <= v; l = r + 1)
{
r = min(m, v / (v / l));
s = (s + (r - l + 1) % MOD * (v / l % MOD) % MOD) % MOD;
}
ll mid = m / n;
ll res = (mid - 1) % MOD * (n % MOD) % MOD;
for (ll l = mid + 1, r; l <= m; l = r + 1)
{
r = m / (m / l);
res = (res + (r - l + 1) % MOD * (m / l % MOD) % MOD) % MOD;
}
cout << (res * (((m % MOD) * (v % MOD) % MOD - s + MOD) % MOD) % MOD * inv(m % MOD * ((m - 1) % MOD) % MOD) % MOD + n % MOD * inv(m % MOD) % MOD * s % MOD) % MOD << endl;
}
return 0;
}