結果
問題 | No.2206 Popcount Sum 2 |
ユーザー | lddlinan |
提出日時 | 2023-03-14 13:09:19 |
言語 | C++17 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 879 ms / 4,000 ms |
コード長 | 1,993 bytes |
コンパイル時間 | 753 ms |
コンパイル使用メモリ | 87,704 KB |
実行使用メモリ | 186,380 KB |
最終ジャッジ日時 | 2024-09-18 08:01:34 |
合計ジャッジ時間 | 15,930 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 3 ms
7,248 KB |
testcase_01 | AC | 3 ms
7,248 KB |
testcase_02 | AC | 294 ms
182,360 KB |
testcase_03 | AC | 293 ms
182,628 KB |
testcase_04 | AC | 294 ms
164,736 KB |
testcase_05 | AC | 869 ms
186,380 KB |
testcase_06 | AC | 869 ms
166,144 KB |
testcase_07 | AC | 868 ms
166,144 KB |
testcase_08 | AC | 861 ms
166,144 KB |
testcase_09 | AC | 879 ms
166,144 KB |
testcase_10 | AC | 854 ms
166,144 KB |
testcase_11 | AC | 861 ms
166,016 KB |
testcase_12 | AC | 850 ms
166,144 KB |
testcase_13 | AC | 833 ms
166,144 KB |
testcase_14 | AC | 834 ms
166,144 KB |
testcase_15 | AC | 839 ms
166,272 KB |
testcase_16 | AC | 855 ms
166,016 KB |
testcase_17 | AC | 853 ms
166,144 KB |
testcase_18 | AC | 853 ms
166,016 KB |
ソースコード
#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 ns[200004]; int ms[200004]; int main() { int n, i, m, k, nn; int inv2 = expit(2, MOD-2); int xn; int tc; scanf("%d", &tc); for (i=0; i<tc; i++) scanf("%d %d", &ns[i], &ms[i]); xn=ns[0]; for (i=0; i<tc; i++) xn=max(xn, ns[i]); LL r, t, s; bb[0]=1; ft[0]=ift[0]=1; for (i=1; i<=xn+BB&&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<=xn; i++) ss[i]=(ss[i-1]+bb[i-1])%MOD; for (n=BB; n<=xn+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; } } // while(tc) { tc--; // scanf("%d %d", &n, &m); for (i=0; i<tc; i++) { n=ns[i]; m=ms[i]; n--; m--; k = (n+BB-1)/BB-1; if (k<0) k=0; 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; }