别问我我怎么直接上强度
2024-09-24 19:46:50
发布于:北京
11阅读
0回复
0点赞
#include <bits/stdc++.h>
using namespace std;
#define Int register int
#define MAXX 20000005
#define mod 998244353
#define Gi 332748118
#define MAXN 800005
#define G 3
int quick_pow (int a,int b,int c){
int res = 1;
while (b){
if (b & 1) res = 1ll * res * a % c;
a = 1ll * a * a % c;
b >>= 1;
}
return res;
}
int l,limit,r[MAXN];
void NTT (int *a,int type){
for (Int i = 0;i < limit;++ i)
if (i < r[i]) swap (a[i],a[r[i]]);
for (Int mid = 1;mid < limit;mid <<= 1){
int Wn = quick_pow (type == 1 ? G : Gi,(mod - 1) / (mid << 1),mod);
for (Int R = mid << 1,j = 0;j < limit;j += R){
int w = 1;
for (Int k = 0;k < mid;++ k,w = 1ll * w * Wn % mod){
int x = a[j + k],y = 1ll * w * a[j + k + mid] % mod;
a[j + k] = (x + y) % mod,a[j + k + mid] = (x + mod - y) % mod;
}
}
}
if (type == 1) return ;
int Inv = quick_pow (limit,mod - 2,mod);
for (Int i = 0;i < limit;++ i) a[i] = 1ll * a[i] * Inv % mod;
}
template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T,typename ... Args> inline void read (T &t,Args&... args){read (t);read (args...);}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');}
int N,M,S,L;
int A[MAXN],B[MAXN];
int inv[MAXX],fac[MAXX];
void SiteLin (int n){
for (Int i = 0;i <= n;++ i){
A[i] = (i & 1) ? mod - inv[i] : inv[i];
B[i] = 1ll * quick_pow (i,n,mod) * inv[i] % mod;
}
limit = 1,l = 0;
while (limit <= (n << 1)) limit <<= 1,l ++;
for (Int i = 0;i < limit;++ i) r[i] = (r[i >> 1] >> 1) | ((i & 1) << l - 1);
NTT (A,1),NTT (B,1);
for (Int i = 0;i < limit;++ i) A[i] = 1ll * A[i] * B[i] % mod;
NTT (A,-1);
}
int C (int n,int m){
return 1ll * fac[n] * inv[m] % mod * inv[n - m] % mod;
}
signed main(){
read (N,M,S,L);
inv[0] = inv[1] = fac[0] = 1;int uu = max (N,L);
for (Int i = 1;i <= uu;++ i) fac[i] = 1ll * fac[i - 1] * i % mod;
inv[uu] = quick_pow (fac[uu],mod - 2,mod);
for (Int i = uu - 1;~i;-- i) inv[i] = 1ll * inv[i + 1] * (i + 1) % mod;
SiteLin (L);
while (S --){
int n,m,k;
read (n,m,k);int ans = 0;
for (Int i = 0;i <= min (L,min (m,k));++ i) ans = (ans + 1ll * A[i] * inv[m - i] % mod * fac[n - i] % mod * inv[k - i]) % mod;
write (1ll * ans * fac[m] % mod * fac[k] % mod * inv[n] % mod),putchar ('\n');
}
return 0;
}
这里空空如也
有帮助,赞一个