結果
| 問題 |
No.2243 Coaching Schedule
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-05-11 09:51:39 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
RE
|
| 実行時間 | - |
| コード長 | 2,565 bytes |
| コンパイル時間 | 2,165 ms |
| コンパイル使用メモリ | 198,452 KB |
| 最終ジャッジ日時 | 2025-02-12 21:19:23 |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 17 RE * 20 |
ソースコード
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define per(i,a,b) for(int i=(a);i>=(b);i--)
#define fi first
#define se second
#define eb emplace_back
#define popc __builtin_popcount
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<pii> vp;
typedef unsigned long long ull;
typedef long double ld;
int read() {
int x=0,w=1; char c=getchar();
while(!isdigit(c)) {if(c=='-') w=-1; c=getchar();}
while(isdigit(c)) {x=x*10+(c-'0'); c=getchar();}
return x*w;
}
const int N=2e5+9,mod=998244353;
int m,n,a[N],f[N],fac[N],ifac[N],inv[N],ans,b[N],g[N],x[N],y[N];
vi p;
int ksm(int x,int y,int res=1) {
for(;y;y>>=1,x=x*x%mod) if(y%2==1) res=res*x%mod;
return res;
}
void pre(int n) {
inv[0]=inv[1]=fac[0]=ifac[0]=1;
rep(i,1,n) fac[i]=fac[i-1]*i%mod;
ifac[n]=ksm(fac[n],mod-2);
per(i,n-1,1) ifac[i]=ifac[i+1]*(i+1)%mod;
rep(i,2,n) inv[i]=ifac[i]*fac[i-1]%mod;
}
int C(int x,int y) {
if(x<0||y<0||x<y) return 0;
else return fac[x]*ifac[y]%mod*ifac[x-y]%mod;
}
namespace Poly {
const int mod=998244353,gg=3,ig=332748118;
int lim,r[N],a[N],b[N],c[N],d[N],e[N],h[N];
void init(int n) {
int l=0;
for(lim=1;lim<=n;lim<<=1,l++);
rep(i,0,lim) r[i]=(r[i>>1]>>1)|((i&1)<<l-1);
}
int pls(int x,int y) {return x+=y,x>=mod?x-mod:x;}
int mns(int x,int y) {return x-=y,x<0?x+=mod:x;}
void ntt(int *f,int lim,int t) {
rep(i,0,lim-1) if(i<r[i]) swap(f[i],f[r[i]]);
for(int len=1;len<lim;len<<=1) {
int dw=ksm(t>0?gg:ig,(mod-1)/(len*2));
for(int i=0;i<lim;i+=len*2) {
int w=1;
for(int j=0;j<len;j++,w=w*dw%mod) {
int x=f[i+j], y=w*f[i+j+len]%mod;
f[i+j]=pls(x,y), f[i+j+len]=mns(x,y);
}
}
}
if(t==-1) {
int iv=ksm(lim,mod-2);
rep(i,0,lim) f[i]=f[i]*iv%mod;
}
}
void _mul(int *f,int *g,int len) {
init(len);
ntt(f,lim,1), ntt(g,lim,1);
rep(i,0,lim-1) f[i]=f[i]*g[i]%mod;
ntt(f,lim,-1);
}
}
signed main() {
m=read(), n=read(); pre(2*n);
rep(i,1,n) a[read()]++;
rep(i,1,m) b[a[i]]++;
rep(i,1,n) if(b[i]) p.eb(i);
rep(i,1,n) {
f[i]=1;
for(int k:p) f[i]=(f[i]*ksm(C(i,k),b[k]))%mod;
}
rep(i,1,n) if(i&1) x[i]=mod-fac[i]; else x[i]=fac[i];
rep(i,0,n) y[i]=ifac[n-i]%mod;
Poly::_mul(x,y,2*n);
rep(i,1,n) g[i]=x[i+n]*ifac[i]%mod;
rep(i,1,n) if(i&1) g[i]=mod-g[i];
rep(i,1,n) ans=(ans+f[i]*g[i])%mod;
rep(i,1,m) ans=ans*fac[a[i]]%mod;
printf("%lld\n",ans);
return 0;
}