結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-21 18:09:51 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 523 ms / 4,000 ms |
コード長 | 1,062 bytes |
コンパイル時間 | 2,875 ms |
コンパイル使用メモリ | 282,868 KB |
実行使用メモリ | 14,588 KB |
最終ジャッジ日時 | 2025-08-21 18:10:04 |
合計ジャッジ時間 | 12,699 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include<bits/stdc++.h> #define int long long #define mod 998244353 #define N 200005 using namespace std; struct Data{int x,y,num;}w[N]; int n,B,l,r,res=1,fac[N],inv[N],ans[N],p[N]; bool cmp(Data x,Data y) { if(x.x/B!=y.x/B) return x.x<y.x; if((x.x/B)&1) return x.y<y.y; return x.y>y.y; } int C(int n,int m) { if(n<m) return 0; return fac[n]*inv[m]%mod*inv[n-m]%mod; } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); p[0]=fac[0]=1; for(int i=1;i<=200000;i++) fac[i]=fac[i-1]*i%mod; inv[200000]=532999597; for(int i=1;i<=200000;i++) p[i]=p[i-1]*2%mod; for(int i=199999;i>=0;i--) inv[i]=inv[i+1]*(i+1)%mod; cin>>n; B=sqrt(n); for(int i=1;i<=n;i++) cin>>w[i].x>>w[i].y,w[i].num=i,w[i].x--,w[i].y--; sort(w+1,w+n+1,cmp); for(int i=1;i<=n;i++) { while(w[i].x<l) res=(res+C(--l,r))*inv[2]%mod; while(w[i].y>r) res=(res+C(l,++r))%mod; while(w[i].x>l) res=(res*2-C(l++,r))%mod; while(w[i].y<r) res=(res-C(l,r--))%mod; ans[w[i].num]=(p[w[i].x+1]-1)*res%mod; } for(int i=1;i<=n;i++) cout<<(ans[i]+mod)%mod<<"\n"; return 0; }