結果
| 問題 | No.2206 Popcount Sum 2 |
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-08-03 20:47:37 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 2,663 ms / 4,000 ms |
| コード長 | 1,578 bytes |
| 記録 | |
| コンパイル時間 | 1,339 ms |
| コンパイル使用メモリ | 166,896 KB |
| 実行使用メモリ | 17,160 KB |
| 最終ジャッジ日時 | 2025-08-03 20:48:18 |
| 合計ジャッジ時間 | 36,942 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i = (a);i<=(b);i++)
#define lep(i,a,b) for(int i = (a);i>=(b);i--)
using namespace std;
const int N = 3e5+10;
const int M = 998244353;
int n,B,ans[N];
int fac[N],inv[N];
inline int qpow(int a,int b){
int c = 1;
while(b){
if(b&1) c = c*a%M;
a = a*a%M;
b>>=1;
}
return c;
}
inline int C(int n,int m){
if(n<m) return 0;
return fac[n]*inv[m]%M*inv[n-m]%M;
}
inline void init(int n){
fac[0] = 1;rep(i,1,n) fac[i] = fac[i-1]*i%M;
inv[n] = qpow(fac[n],M-2); lep(i,n-1,0) inv[i] = inv[i+1]*(i+1)%M;
}
struct node{
int l,r,id;
}q[N];
inline bool cmp(node _,node __){
if((_.l-1)/B+1 == (__.l-1)/B+1){
if(((_.l-1)/B+1)&1) return _.r<__.r;
else return _.r>__.r;
}
return (_.l-1)/B+1<(__.l-1)/B+1;
}
int L,R,A;
inline void addl(int l,int r){
A = (A*2%M-C(l,r)%M+M)%M;
}
inline void addr(int l,int r){
A = (A+C(l,r+1)%M)%M;
}
inline void dell(int l,int r){
A = ((A+C(l-1,r))%M*qpow(2,M-2)%M)%M;
}
inline void delr(int l,int r){
A = (A-C(l,r)%M+M)%M;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
cin>>n;
rep(i,1,n) cin>>q[i].l>>q[i].r,q[i].id = i;
init(200010);
B = sqrt(n);
sort(q+1,q+1+n,cmp);
rep(i,1,n) ans[q[i].id] = (qpow(2,q[i].l)-1+M)%M;
A = 1;
rep(i,1,n){
q[i].l--,q[i].r--;
while(L<q[i].l) addl(L,R),L++;
while(R<q[i].r) addr(L,R),R++;
while(L>q[i].l) dell(L,R),L--;
while(R>q[i].r) delr(L,R),R--;
//cout<<L<<" "<<R<<"\n";
//cout<<A<<"\n";
ans[q[i].id] = (ans[q[i].id]*A)%M;
}
rep(i,1,n) cout<<ans[i]<<"\n";
return 0;
}
vjudge1