結果
問題 | No.2243 Coaching Schedule |
ユーザー | lgswdn |
提出日時 | 2023-05-11 09:52:02 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 508 ms / 4,000 ms |
コード長 | 2,565 bytes |
コンパイル時間 | 2,254 ms |
コンパイル使用メモリ | 205,348 KB |
実行使用メモリ | 16,768 KB |
最終ジャッジ日時 | 2024-11-27 09:57:30 |
合計ジャッジ時間 | 7,468 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 3 ms
5,248 KB |
testcase_05 | AC | 72 ms
16,768 KB |
testcase_06 | AC | 105 ms
16,640 KB |
testcase_07 | AC | 105 ms
16,768 KB |
testcase_08 | AC | 101 ms
16,768 KB |
testcase_09 | AC | 131 ms
16,128 KB |
testcase_10 | AC | 131 ms
16,128 KB |
testcase_11 | AC | 132 ms
16,256 KB |
testcase_12 | AC | 508 ms
16,000 KB |
testcase_13 | AC | 414 ms
16,768 KB |
testcase_14 | AC | 419 ms
16,640 KB |
testcase_15 | AC | 414 ms
16,768 KB |
testcase_16 | AC | 65 ms
16,000 KB |
testcase_17 | AC | 28 ms
7,296 KB |
testcase_18 | AC | 84 ms
14,848 KB |
testcase_19 | AC | 117 ms
15,616 KB |
testcase_20 | AC | 87 ms
10,624 KB |
testcase_21 | AC | 45 ms
9,984 KB |
testcase_22 | AC | 43 ms
9,472 KB |
testcase_23 | AC | 8 ms
5,248 KB |
testcase_24 | AC | 57 ms
10,624 KB |
testcase_25 | AC | 11 ms
5,376 KB |
testcase_26 | AC | 23 ms
7,168 KB |
testcase_27 | AC | 61 ms
10,752 KB |
testcase_28 | AC | 12 ms
5,376 KB |
testcase_29 | AC | 97 ms
14,336 KB |
testcase_30 | AC | 98 ms
15,744 KB |
testcase_31 | AC | 98 ms
16,256 KB |
testcase_32 | AC | 43 ms
9,088 KB |
testcase_33 | AC | 23 ms
7,552 KB |
testcase_34 | AC | 86 ms
14,464 KB |
testcase_35 | AC | 100 ms
15,104 KB |
testcase_36 | AC | 92 ms
15,616 KB |
ソースコード
#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=3e5+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; }