結果

問題 No.2243 Coaching Schedule
ユーザー lgswdnlgswdn
提出日時 2023-05-11 09:52:02
言語 C++17
(gcc 12.3.0 + boost 1.83.0)
結果
AC  
実行時間 510 ms / 4,000 ms
コード長 2,565 bytes
コンパイル時間 2,302 ms
コンパイル使用メモリ 202,380 KB
実行使用メモリ 26,380 KB
最終ジャッジ日時 2023-08-18 06:29:57
合計ジャッジ時間 7,772 ms
ジャッジサーバーID
(参考情報)
judge12 / judge14
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 6 ms
21,920 KB
testcase_01 AC 6 ms
21,920 KB
testcase_02 AC 6 ms
22,136 KB
testcase_03 AC 5 ms
21,912 KB
testcase_04 AC 6 ms
22,116 KB
testcase_05 AC 71 ms
25,376 KB
testcase_06 AC 101 ms
25,424 KB
testcase_07 AC 101 ms
25,352 KB
testcase_08 AC 100 ms
25,356 KB
testcase_09 AC 128 ms
25,492 KB
testcase_10 AC 130 ms
25,380 KB
testcase_11 AC 130 ms
25,340 KB
testcase_12 AC 510 ms
25,492 KB
testcase_13 AC 411 ms
25,388 KB
testcase_14 AC 416 ms
25,548 KB
testcase_15 AC 412 ms
25,344 KB
testcase_16 AC 63 ms
25,392 KB
testcase_17 AC 29 ms
26,276 KB
testcase_18 AC 83 ms
25,120 KB
testcase_19 AC 118 ms
25,472 KB
testcase_20 AC 86 ms
26,252 KB
testcase_21 AC 46 ms
26,380 KB
testcase_22 AC 43 ms
26,252 KB
testcase_23 AC 10 ms
22,244 KB
testcase_24 AC 57 ms
26,364 KB
testcase_25 AC 13 ms
22,308 KB
testcase_26 AC 24 ms
26,360 KB
testcase_27 AC 61 ms
26,300 KB
testcase_28 AC 13 ms
22,208 KB
testcase_29 AC 96 ms
25,144 KB
testcase_30 AC 94 ms
25,276 KB
testcase_31 AC 96 ms
25,288 KB
testcase_32 AC 43 ms
26,272 KB
testcase_33 AC 26 ms
26,312 KB
testcase_34 AC 85 ms
25,200 KB
testcase_35 AC 99 ms
25,404 KB
testcase_36 AC 91 ms
25,232 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#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;
}
0