結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-02 16:31:09 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 2,915 ms / 4,000 ms |
コード長 | 1,526 bytes |
コンパイル時間 | 1,459 ms |
コンパイル使用メモリ | 162,172 KB |
実行使用メモリ | 16,284 KB |
最終ジャッジ日時 | 2025-08-02 16:31:49 |
合計ジャッジ時間 | 38,997 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include<bits/stdc++.h> using namespace std; #define int long long inline int read(){ int x=0,f=1;char c=getchar(); while(c>57||c<48){if(c==45)f=-1;c=getchar();} while(c<=57&&c>=48){x=(x<<1)+(x<<3)+(c^48);c=getchar();} return x*f; } const int N=2e5+2,P=998244353; inline int fast(int d,int z){ int res=1; while(z){if(z&1)res=(res*d)%P;d=(d*d)%P;z>>=1;}return res; } int jc[N],invj[N]; inline void init(){ jc[0]=jc[1]=invj[1]=invj[0]=1; for(int i=2;i<=200000;++i)jc[i]=(jc[i-1]*i)%P, invj[i]=fast(jc[i],P-2); } inline int AA(int n,int m){ if(n<m)return 0; if(m==0)return 1; return jc[n]*invj[n-m]%P; } inline int CC(int n,int m){ if(n<m)return 0; if(m==0||n==0)return 1; return jc[n]*invj[n-m]%P*invj[m]%P; } int n,Q,B=447,Ans[N],bK[N],NN[N]; struct ques{ int n,m,id; }a[N]; inline bool cmp(ques u,ques v){ if(bK[u.n]==bK[v.n])return u.m<v.m; return u.n<v.n; } signed main(){ init(); Q=read(); for(int i=1;i<=Q;++i){ a[i].n=read();NN[i]=a[i].n;--a[i].n; a[i].m=read();--a[i].m; a[i].id=i; } for(int i=1;i<=200000;++i)bK[i]=(i-1)/B+1; sort(a+1,a+1+Q,cmp); int LN=0,LM=0,res=1; for(int i=1;i<=Q;++i){ while(LM<a[i].m){ ++LM;res=(res+CC(LN,LM))%P; } while(LM>a[i].m){ res=(res-CC(LN,LM)+P)%P;--LM; } while(LN<a[i].n){ res=(res*2-CC(LN,LM)+P)%P; ++LN; } while(LN>a[i].n){ --LN; res=(res+CC(LN,LM)%P)%P; res*=fast(2,P-2);res%=P; } Ans[a[i].id]=res; } for(int i=1;i<=Q;++i){ int ans=Ans[i]*(fast(2,NN[i])-1)%P; printf("%lld\n",(ans+P)%P); } return 0; }