結果
| 問題 |
No.2206 Popcount Sum 2
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-08-19 17:40:47 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 806 ms / 4,000 ms |
| コード長 | 1,729 bytes |
| コンパイル時間 | 662 ms |
| コンパイル使用メモリ | 74,596 KB |
| 実行使用メモリ | 13,284 KB |
| 最終ジャッジ日時 | 2025-08-19 17:41:00 |
| 合計ジャッジ時間 | 12,231 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long
#define N 200005
#define INF (ll)1e18
#define PII pair<ll, ll>
#define lowbit(x) x&(-x)
using namespace std;
inline ll rd(){
ll res=0, f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') res=(res<<3)+(res<<1)+(ch^48), ch=getchar();
return (f>0?res:-res);
}
ll T, n, m, bl, l, r, res;
ll p[N], inv[N], ans[N];
const ll mod=998244353;
ll ksm(ll a, ll b){
ll res=1;
while(b){
if(b&1) res=res*a%mod;
a=a*a%mod;
b>>=1;
}
return res;
}
ll C(ll n, ll m){
if(n<m) return 0;
return p[n]*inv[m]%mod*inv[n-m]%mod;
}
struct Data{
ll l, r, id;
}q[N];
bool cmp(Data x, Data y){
if(x.l/bl!=y.l/bl) return x.l<y.l;
return x.r<y.r;
}
void addl(ll x){
res=(res+C(x, r))%mod*((mod+1)>>1)%mod;
}
void dell(ll x){
res=(res*2%mod-C(x, r)+mod)%mod;
}
void addr(ll x){
res=(res+C(l, x))%mod;
}
void delr(ll x){
res=(res-C(l, x)+mod)%mod;
}
int main(){
T=rd(), bl=sqrt(2e5), p[0]=1;
for (int i=1; i<=N-5; i++) p[i]=(p[i-1]*i)%mod;
inv[N-5]=ksm(p[N-5], mod-2);
for (int i=N-6; i>=0; i--) inv[i]=(inv[i+1]*(i+1))%mod;
for(int i=1; i<=T; i++) q[i]={rd()-1, rd()-1, i};
sort(q+1, q+T+1, cmp);
l=0, r=0, res=1;
for(int i=1; i<=T; i++){
// cout<<q[i].l<<' '<<q[i].r<<endl;
while(l<q[i].l) dell(l++);
while(l>q[i].l) addl(--l);
while(r<q[i].r) addr(++r);
while(r>q[i].r) delr(r--);
// cout<<res<<endl;
ans[q[i].id]=res*(ksm(2, q[i].l+1)-1)%mod;
}
for (int i=1; i<=T; i++) printf("%lld\n", ans[i]);
return 0;
}
/*
*/
vjudge1