题解:P7950 [✗✓OI R1] 后方之水
PaoHui_JiangQAQ · · 题解
很有意思的组合计数题目
考虑将序列中的三个数
对于更多数合并的情况也同理,归纳可以得到:
我们可以对其进行处理
对
我们要求
这个式子让我想了很久不知道怎么化,因为我记得组合数常用那几个公式里没有带
于是想到把
我们知道
不知道的话也可以考虑组合意义,即在
上面的式子就可以化简成
故
这里注意
#include<iostream>
using namespace std;
#define int long long
int t,calc = 1,inv[1000005] = {1};
const int mod = 998244353;
int qpow(int a,int b)
{
if(b == 0) return 1;
int p = qpow(a,b / 2);
if(b & 1) return p * p % mod * a % mod;
return p * p % mod;
}
int C(int n,int a)
{
if(a < 0 || n < a || n < 0) return 0;
int ans = inv[a];
for(int i = n - a + 1; i <= n; i++) ans = ans * i % mod;
return ans;
}
void work()
{
int n,s;
cin >> n >> s;
cout << ((s * s % mod * C(s - 1,n - 1) % mod - n * (2 * C(s,n + 1) + C(s,n)) % mod) % mod + mod) % mod * qpow(2,mod - 2) % mod << '\n';
}
main()
{
for(int i = 1; i <= 1000000; i++) calc = calc * i % mod;
inv[1000000] = qpow(calc,mod - 2);
for(int i = 999999; i >= 0; i--) inv[i] = inv[i + 1] * (i + 1) % mod;
cin >> t;
while(t--) work();
}