結果
問題 | No.2872 Depth of the Parentheses |
ユーザー | kotatsugame |
提出日時 | 2024-09-06 22:36:57 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 52 ms / 2,000 ms |
コード長 | 2,792 bytes |
コンパイル時間 | 1,395 ms |
コンパイル使用メモリ | 87,708 KB |
実行使用メモリ | 14,016 KB |
最終ジャッジ日時 | 2024-09-06 22:37:43 |
合計ジャッジ時間 | 18,591 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 52 ms
13,880 KB |
testcase_01 | AC | 52 ms
11,548 KB |
testcase_02 | AC | 52 ms
14,016 KB |
testcase_03 | AC | 52 ms
11,420 KB |
testcase_04 | AC | 52 ms
14,012 KB |
testcase_05 | AC | 52 ms
11,428 KB |
testcase_06 | AC | 51 ms
14,012 KB |
testcase_07 | AC | 52 ms
11,424 KB |
testcase_08 | AC | 52 ms
14,016 KB |
testcase_09 | AC | 52 ms
6,940 KB |
testcase_10 | AC | 52 ms
6,940 KB |
testcase_11 | AC | 52 ms
6,940 KB |
testcase_12 | AC | 52 ms
6,940 KB |
testcase_13 | AC | 52 ms
6,940 KB |
testcase_14 | AC | 52 ms
6,940 KB |
testcase_15 | AC | 52 ms
6,940 KB |
testcase_16 | AC | 52 ms
6,944 KB |
testcase_17 | AC | 52 ms
6,940 KB |
testcase_18 | AC | 52 ms
6,940 KB |
testcase_19 | AC | 51 ms
6,944 KB |
testcase_20 | AC | 51 ms
6,940 KB |
testcase_21 | AC | 50 ms
6,940 KB |
testcase_22 | AC | 52 ms
6,944 KB |
evil_01.txt | TLE | - |
evil_02.txt | TLE | - |
evil_03.txt | TLE | - |
evil_04.txt | TLE | - |
evil_05.txt | TLE | - |
ソースコード
#pragma GCC optimize("Ofast") #include<iostream> #include<cassert> #include<atcoder/modint> using namespace std; #include<vector> template<typename T> struct combination{ vector<T>fac,ifac; combination(size_t N=0):fac(1,1),ifac(1,1) { make_table(N); } void make_table(size_t N) { if(fac.size()>N)return; size_t now=fac.size(); N=max(N,now*2); fac.resize(N+1); ifac.resize(N+1); for(size_t i=now;i<=N;i++)fac[i]=fac[i-1]*i; ifac[N]=1/fac[N]; for(size_t i=N;i-->now;)ifac[i]=ifac[i+1]*(i+1); } T factorial(size_t n) { make_table(n); return fac[n]; } T invfac(size_t n) { make_table(n); return ifac[n]; } T P(size_t n,size_t k) { if(n<k)return 0; make_table(n); return fac[n]*ifac[n-k]; } T C(size_t n,size_t k) { if(n<k)return 0; make_table(n); return fac[n]*ifac[n-k]*ifac[k]; } T H(size_t n,size_t k) { if(n==0)return k==0?1:0; return C(n-1+k,k); } }; using mint=atcoder::modint998244353; combination<mint>C; int x,K; mint p,q; mint f(int c,int d) { assert(c>=d&&(c-d)%2==0); if(d<=5000)return mint::raw(1); mint ret=0; for(int i=0;abs(i-d)<=c;i+=2*d+4) { ret+=C.C(c,(c+abs(i-d))/2); } for(int i=-2*d-4;abs(i-d)<=c;i-=2*d+4) { ret+=C.C(c,(c+abs(i-d))/2); } for(int i=-2;abs(i-d)<=c;i+=2*d+4) { ret-=C.C(c,(c+abs(i-d))/2); } for(int i=-2-2*d-4;abs(i-d)<=c;i-=2*d+4) { ret-=C.C(c,(c+abs(i-d))/2); } return ret; } const int D=350; mint dp[2][D+2][D+2]; mint ret[2][20001]; void g(int d,int id) { assert(d>=D); const int sz=2*K-d; for(int c=0;c<=sz;c++)ret[id][c]=0; const int w=2*d+4; for(int i=w;i-d<=sz;i+=w) { int v=i-d; for(int c=v;c<=sz;c+=2)ret[id][c]+=C.C(c,(c+v)/2); } for(int i=0;d-i<=sz;i-=w) { int v=d-i; for(int c=v;c<=sz;c+=2)ret[id][c]+=C.C(c,(c+v)/2); } for(int i=-2+w;i-d<=sz;i+=w) { int v=i-d; for(int c=v;c<=sz;c+=2)ret[id][c]-=C.C(c,(c+v)/2); } for(int i=-2;d-i<=sz;i-=w) { int v=d-i; for(int c=v;c<=sz;c+=2)ret[id][c]-=C.C(c,(c+v)/2); } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>x>>K; int now=0; dp[now][1][1]=1; for(int i=1;i<K;i++) { int nxt=1-now; for(int d=1;d<=D;d++) { dp[nxt][d][0]=dp[now][d][1]; for(int v=1;v<=d;v++) { dp[nxt][d][v]=dp[now][d][v-1]+dp[now][d][v+1]; } } for(int d=1;d<=D;d++) { dp[nxt][d][d]+=dp[now][d-1][d-1]; } now=nxt; } p=mint::raw(x)/100; q=1-p; mint ans=0; for(int ld=1;ld<=D;ld++)for(int rd=1;rd<=D;rd++) { for(int v=0;v<=min(ld,rd);v++) { ans+=dp[now][ld][v]*dp[now][rd][v]*max(ld,rd); } } now=0; if(D<=K)g(D,now); for(int d=D+1;d<=K;d++) { int nxt=1-now; g(d,nxt); mint cur=0; for(int l=d;l<=K*2-d;l+=2) { cur+=ret[now][l-1]*ret[nxt][2*K-l]; } ans+=cur*d; now=nxt; } ans*=(p*q).pow(K); cout<<ans.val()<<endl; }