結果
問題 | No.2206 Popcount Sum 2 |
ユーザー | lddlinan |
提出日時 | 2023-03-14 12:56:56 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,783 bytes |
コンパイル時間 | 878 ms |
コンパイル使用メモリ | 86,888 KB |
実行使用メモリ | 319,584 KB |
最終ジャッジ日時 | 2024-09-18 08:00:58 |
合計ジャッジ時間 | 21,773 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 342 ms
175,080 KB |
testcase_01 | TLE | - |
testcase_02 | WA | - |
testcase_03 | AC | 296 ms
180,972 KB |
testcase_04 | WA | - |
testcase_05 | TLE | - |
testcase_06 | WA | - |
testcase_07 | WA | - |
testcase_08 | TLE | - |
testcase_09 | TLE | - |
testcase_10 | WA | - |
testcase_11 | WA | - |
testcase_12 | WA | - |
testcase_13 | WA | - |
testcase_14 | WA | - |
testcase_15 | WA | - |
testcase_16 | WA | - |
testcase_17 | WA | - |
testcase_18 | WA | - |
ソースコード
#include<stdio.h> #include<string.h> #include<stdlib.h> #include <map> #include <vector> #include <queue> #include <deque> #include <set> #include <stack> #include <algorithm> #include <array> #include <unordered_set> #include <unordered_map> #include <string> using namespace std; bool rcmp(int a, int b) { return a>b; } typedef long long LL; #define MOD 998244353 int expit(LL b, int e) { LL r=1; while(e) { if (e&1) { r*=b; r%=MOD; } b*=b; b%=MOD; e>>=1; } return r; } int bb[200004]; int ss[200004]; int ft[200004]; int ift[200004]; #define BB 500 int xx[401][200004]; // (500+200000)*400/2 int main() { int n, i, m, k, nn; int inv2 = expit(2, MOD-2); LL r, t, s; bb[0]=1; ft[0]=ift[0]=1; for (i=1; i<=200000; i++) { bb[i]=(bb[i-1]*2)%MOD; r=ft[i-1]; r*=i; r%=MOD; ft[i]=r; ift[i]=expit(r, MOD-2); } ss[0]=0; for (i=1; i<=200000; i++) ss[i]=(ss[i-1]+bb[i-1])%MOD; for (n=BB; n<200000; n+=BB) { k = n/BB-1; s=0; for (m=0; m<=n; m++) { t=ft[n]; t*=ift[m]; t%=MOD; t*=ift[n-m]; t%=MOD; s+=t; s%=MOD; xx[k][m]=s; } } int tc; scanf("%d", &tc); while(tc) { tc--; scanf("%d %d", &n, &m); // printf("%d:%d\n", n, ss[n]); n--; m--; k = (n+BB-1)/BB-1; nn = (k+1)*BB; r = xx[k][m]; while(nn>n) { nn--; // move nn-> nn-1 t=ft[nn]; t*=ift[m]; t%=MOD; t*=ift[nn-m]; t%=MOD; t+=r; t%=MOD; t*=inv2; t%=MOD; r=t; } // c(n-1, m-1)+...C(n-1, 0) // r=ft[n-1]; r*=ift[m-1]; r%=MOD; r*=ift[n-m]; r%=MOD; r*=ss[n+1]; r%=MOD; printf("%lld\n", r); } return 0; }