結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 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();}