#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL M = 998244353;
const int N = 1e6 + 10;
LL Pow(LL a, LL b)
{
LL ans = 1;
while(b)
{
if(b&1) ans = ans * a % M;
a = a * a % M;
b >>= 1;
}
return ans;
}
LL C[N],A[N];
int main()
{
int T,cas = 1;
scanf("%d",&T);
while(T--)
{
LL n , m;
scanf("%lld %lld", &n, &m);
LL minn = min(n , m);
C[0] = 1;
C[1] = (n-1) % M;
A[1] = m % M;
n = n % M;
m = m % M;
for(int i = 2; i<=minn; ++i) {
C[i] = C[i-1] * (n-i) % M * Pow(i,M-2) % M;
A[i] = A[i-1] * (m-i+1) % M;
}
LL ans = 0;
for(int i = 1; i<=minn; ++i) {
ans = (ans + A[i] * C[i-1] % M) % M;
}
printf("Case #%d: %lld\n",cas++,ans);
}
return 0;
}
有空再来写自己的想法
这个程序跑的时间接近给的时间,发现加个逆元的递推预处理会快很多
inv[1] = inv[0] = 1;
for(int i = 2; i < N; ++i) {
inv[i] = (M-M/i)*inv[M%i]%M;
}
这是公式,可以求出1到10^6的逆元