結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-02 17:46:40 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 1,201 ms / 4,000 ms |
コード長 | 1,238 bytes |
コンパイル時間 | 1,973 ms |
コンパイル使用メモリ | 198,376 KB |
実行使用メモリ | 22,404 KB |
最終ジャッジ日時 | 2025-08-02 17:46:58 |
合計ジャッジ時間 | 17,653 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=1000010; const ll p=998244353; ll fac[N],inv[N]; ll power(ll x,ll y){ ll res=1; for(;y;y>>=1){ if(y&1) res=res*x%p; x=x*x%p; } return res; } ll C(ll x,ll y){ if(x<y||x<0||y<0) return 0; return fac[x]*inv[y]%p*inv[x-y]%p; } void init(ll n){ fac[0]=1; for(int i=1;i<=n;i++) fac[i]=fac[i-1]*i%p; inv[n]=power(fac[n],p-2); for(int i=n-1;i>=0;i--) inv[i]=inv[i+1]*(i+1)%p; } ll n,B; ll l=0,r=0,res=1,inv2; ll ans[N]; struct node{ ll x,y,id; }q[N]; bool cmp(node x,node y){ if(x.x/B==y.x/B) return x.y<y.y; return x.x/B<y.x/B; } int main(){ init(300000); cin>>n; B=450;inv2=power(2,p-2); for(int i=1;i<=n;i++) cin>>q[i].x>>q[i].y,q[i].id=i; sort(q+1,q+n+1,cmp); for(int i=1;i<=n;i++){ ll X=q[i].y-1,Y=q[i].x-1; while(l>X) res=(res-C(r,l--)+p)%p; // cout<<l<<" "<<r<<" "<<res<<endl; while(r<Y) res=(res*2-C(r++,l)+p)%p; // cout<<l<<" "<<r<<" "<<res<<endl; while(l<X) res=(res+C(r,++l))%p; // cout<<l<<" "<<r<<" "<<res<<endl; while(r>Y) res=(res+C(--r,l))*inv2%p; // cout<<l<<" "<<r<<" "<<res<<endl; ans[q[i].id]=(res*(power(2,q[i].x)-1)%p+p)%p; } for(int i=1;i<=n;i++) cout<<ans[i]<<endl; return 0; } /* 1 20 10 */