結果
| 問題 |
No.2206 Popcount Sum 2
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 2025-08-13 19:57:11 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 2,784 bytes |
| コンパイル時間 | 1,044 ms |
| コンパイル使用メモリ | 85,036 KB |
| 実行使用メモリ | 7,716 KB |
| 最終ジャッジ日時 | 2025-08-13 19:57:21 |
| 合計ジャッジ時間 | 8,518 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 4 TLE * 1 -- * 13 |
ソースコード
#include<iostream>
#include<algorithm>
#include<queue>
#include<array>
#if defined FIO
auto I_=freopen("1.in","r",stdin);
auto O_=freopen("1.out","w",stdout);
#endif
#if defined BUG
#define bug(x...) ({x;void();})
#else
#define bug(x...) ({})
#endif
#define LL long long
#define pb push_back
#define vec vector
#define arr array
#define SIZ(x) (int)(x).size()
#define ALL(x) begin(x),end(x)
#define RNG(x,l,r) &(x)[l],1+&(x)[r]
#define rep(i,l,r) for(int i=(l),i##_=(r);i<=i##_;i++)
#define per(i,l,r) for(int i=(l),i##_=(r);i>=i##_;i--)
#define inline inline __attribute__((always_inline))
template<class U,class V>constexpr inline void tomin(U&x,V&&y)noexcept{if(y<x)x=y;}
template<class U,class V>constexpr inline void tomax(U&x,V&&y)noexcept{if(y>x)x=y;}
using namespace std;namespace __{
template<int P> struct mint{
int x;
inline mint(){}
inline mint(int t){ x=(t+P)%P; }
inline mint(LL t){ x=int(t%P); }
inline operator int()noexcept{ return x; }
inline mint operator+(mint t){ return (x+t.x)%P; }
inline mint operator-(mint t){ return (x-t.x+P)%P; }
inline mint operator*(mint t){ return 1ll*x*t.x%P; }
inline mint& operator+=(mint t){ return *this=*this+t; }
inline mint& operator-=(mint t){ return *this=*this-t; }
inline mint& operator*=(mint t){ return *this=*this*t; }
};
#define mint mint<P>
constexpr int N=2e5+5,P=998244353;
inline mint fpw(mint a,int b,mint r=1){ for(;b;a*=a,b>>=1)if(b&1)r*=a; return r; }
int Q;
struct qq{int a,b,idx,bk;}q[N+5];
mint ans[N];
mint fac[N],invfac[N];
void init(int n){
fac[0]=1; rep(i,1,n) fac[i]=fac[i-1]*mint(i);
invfac[n]=fpw(fac[n],P-2); per(i,n,1) invfac[i-1]=invfac[i]*mint(i);
}
inline mint binom(int a,int b){ return a<b||b<0 ? mint(0) : fac[a] * invfac[b] * invfac[a-b]; }
void modui(){
int B=(int)__builtin_sqrt(Q);
rep(i,1,Q) q[i].bk=q[i].a/B;
sort(RNG(q,1,Q),[](qq i,qq j){
if(i.bk!=j.bk) return i.bk<j.bk;
if(i.a!=j.a) return i.a<j.a;
return i.bk&1 ? i.b>j.b : i.b<j.b;
});
int l=0,r=0;
mint cur=1, inv2=fpw(2,P-2);
auto la=[&](){ cur=cur*mint(2)-binom(l,r); };
auto ra=[&](){ cur+=binom(l,r+1); };
auto ld=[&](){ cur=(cur+binom(l-1,r))*inv2; };
auto rd=[&](){ cur-=binom(l,r); };
rep(i,1,Q){
while(l<q[i].a) la(), l++;
while(r<q[i].b) ra(), r++;
while(l>q[i].a) ld(), l--;
while(r>q[i].b) rd(), r--;
ans[q[i].idx]*=cur;
}
}
void main(){
cin.tie(0)->sync_with_stdio(0);
// signed CSE=0; for(cin>>CSE; CSE--; clear())
[&](){
cin>>Q;
rep(i,1,Q){
int n,m; cin>>n>>m;
ans[i]=fpw(2,n)-mint(1);
q[i]={n-1,m-1,i,0};
}
init(2e5);
modui();
rep(i,1,Q) cout<<ans[i]<<'\n';
}();}}
signed main(){__::main();}
vjudge1