結果
問題 | No.2872 Depth of the Parentheses |
ユーザー | kotatsugame |
提出日時 | 2024-09-06 23:24:52 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 35 ms / 2,000 ms |
コード長 | 1,954 bytes |
コンパイル時間 | 1,090 ms |
コンパイル使用メモリ | 82,840 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-09-06 23:25:08 |
合計ジャッジ時間 | 12,168 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 34 ms
6,816 KB |
testcase_01 | AC | 35 ms
6,944 KB |
testcase_02 | AC | 34 ms
6,940 KB |
testcase_03 | AC | 34 ms
6,944 KB |
testcase_04 | AC | 34 ms
6,944 KB |
testcase_05 | AC | 34 ms
6,944 KB |
testcase_06 | AC | 35 ms
6,940 KB |
testcase_07 | AC | 34 ms
6,944 KB |
testcase_08 | AC | 35 ms
6,944 KB |
testcase_09 | AC | 34 ms
6,940 KB |
testcase_10 | AC | 35 ms
6,940 KB |
testcase_11 | AC | 35 ms
6,940 KB |
testcase_12 | AC | 35 ms
6,940 KB |
testcase_13 | AC | 34 ms
6,940 KB |
testcase_14 | AC | 35 ms
6,944 KB |
testcase_15 | AC | 34 ms
6,940 KB |
testcase_16 | AC | 34 ms
6,940 KB |
testcase_17 | AC | 35 ms
6,940 KB |
testcase_18 | AC | 34 ms
6,944 KB |
testcase_19 | AC | 34 ms
6,940 KB |
testcase_20 | AC | 35 ms
6,940 KB |
testcase_21 | AC | 34 ms
6,940 KB |
testcase_22 | AC | 34 ms
6,940 KB |
evil_01.txt | AC | 1,889 ms
6,940 KB |
evil_02.txt | AC | 1,861 ms
6,944 KB |
evil_03.txt | AC | 1,885 ms
6,940 KB |
evil_04.txt | AC | 1,864 ms
6,944 KB |
evil_05.txt | AC | 1,884 ms
6,944 KB |
ソースコード
#pragma GCC target("avx2") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include<iostream> #include<cassert> #include<atcoder/modint> using namespace std; using mint=atcoder::modint998244353; mint fac[20001],invfac[20001]; int x,K; mint p,q; 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]+=invfac[(c-v)/2]*invfac[(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]+=invfac[(c-v)/2]*invfac[(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]-=invfac[(c-v)/2]*invfac[(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]-=invfac[(c-v)/2]*invfac[(c+v)/2]; } for(int c=0;c<=sz;c++)ret[id][c]*=fac[c]; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cin>>x>>K; fac[0]=1; for(int i=1;i<=2*K;i++)fac[i]=fac[i-1]*mint::raw(i); invfac[2*K]=fac[2*K].inv(); for(int i=2*K;i--;)invfac[i]=invfac[i+1]*mint::raw(i+1); 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++) { mint cur=0; for(int v=0;v<=min(ld,rd);v++) { cur+=dp[now][ld][v]*dp[now][rd][v]; } ans+=cur*mint::raw(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; }