結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-02 17:49:55 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 605 ms / 4,000 ms |
コード長 | 3,507 bytes |
コンパイル時間 | 3,075 ms |
コンパイル使用メモリ | 283,212 KB |
実行使用メモリ | 11,084 KB |
最終ジャッジ日時 | 2025-08-02 17:50:09 |
合計ジャッジ時間 | 12,400 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
ソースコード
#include<bits/stdc++.h> using namespace std; bool ST; namespace FastIO { #ifdef ONLINE_JUDGE char IN[1<<20],*inS=IN,*inT=IN; #define getchar() inS==inT&&(inT=(inS=IN)+fread(IN,1,1<<20,stdin),inS==inT)?EOF:*inS++ char OUT[1<<20],*outS=OUT; #define putchar(x) (outS-OUT==1<<20?fwrite(OUT,1,1<<20,stdout),outS=OUT,0:0,*outS++=x) struct Writer{~Writer(){fwrite(OUT,1,outS-OUT,stdout);}}Writ; #endif template<typename T> inline void read(T &x) { x=0;short f=1;char ch=getchar(); for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') f=-1; for(;ch>='0'&&ch<='9';ch=getchar()) x=(x<<1)+(x<<3)+(ch^48); x=~f?x:-x; } inline void read(char &ch){ch=getchar();for(;ch=='\n'||ch==' ';ch=getchar());} inline void read(char s[]) { int len=0;char ch=getchar(); for(;ch=='\n'||ch==' ';ch=getchar()); for(;ch!='\n'&&ch!=' '&&ch!='\r'&&ch!=EOF;ch=getchar()) s[++len]=ch; s[++len]='\0'; } template<typename T> inline void write(T x) { static char s[105];int top=0; do s[top++]=x%10+'0',x/=10;while(x); for(;top;) putchar(s[--top]); } inline void write(const char* s){for(int i=0;s[i]!='\0';i++)putchar(s[i]);} template<typename T> inline void print(T x,char ch='\n') { if(is_same<char,T>::value) putchar(x); else{if(x<0)putchar('-'),x=-x;write(x);} if(ch!=' '&&ch!='\n'&&ch!='\0') putchar(' '); putchar(ch); if(ch!=' '&&ch!='\n'&&ch!='\0') putchar('\n'); } inline void print(const char* s,char ch='\n'){write(s);putchar(ch);} template<typename T,typename... Args> inline void read(T &x,Args&... args){read(x);read(args...);} template<typename T,typename... Args> inline void print(T x,Args... args){print(x,' ');print(args...);} } using namespace FastIO; constexpr int N=2e5+5,B=448,mod=998244353; namespace math { #define T(x,y) x=(x+(y))%mod #define S(x,y) (1ll*(x)*(y)%mod) int fac[N],inv[N]; int power(int x,int y) { int res=1; for(;y;y>>=1,x=S(x,x)) if(y&1) res=S(res,x); return res; } void prework(int n) { for(int i=fac[0]=1;i<=n;i++) fac[i]=S(fac[i-1],i); inv[n]=power(fac[n],mod-2); for(int i=n-1;i>=0;i--) inv[i]=S(inv[i+1],i+1); } int C(int x,int y){return x<y?0:S(fac[x],S(inv[y],inv[x-y]));} } using namespace math; namespace Junounly { int inv2,Q,n=1,m=1,res[N],id[N],ans=1; struct node{int n,m,id;}q[N]; void addn(int x){ans=(S(ans,2)+mod-C(x-2,m-1))%mod;} void deln(int x){ans=S((ans+C(x-2,m-1))%mod,inv2);} void addm(int x){T(ans,C(n-1,x-1));} void delm(int x){T(ans,mod-C(n-1,x-1));} void main() { read(Q);prework(2e5);inv2=power(2,mod-2); for(int i=1;i<=Q;i++) read(q[i].n,q[i].m),q[i].id=i; for(int i=1;i<=2e5;i++) id[i]=i/B; sort(q+1,q+Q+1,[](node x,node y){return id[x.n]==id[y.n]?(id[x.n]&1?x.m>y.m:x.m<y.m):id[x.n]<id[y.n];}); for(int i=1;i<=Q;i++) { for(;n<q[i].n;) addn(++n); for(;n>q[i].n;) deln(n--); for(;m<q[i].m;) addm(++m); for(;m>q[i].m;) delm(m--); res[q[i].id]=S((power(2,q[i].n)+mod-1)%mod,ans); } for(int i=1;i<=Q;i++) print(res[i]); } } bool ED; int main() { #ifdef ONLINE_JUDGE Junounly::main(); #else double st=clock(); Junounly::main(); double ed=clock(); cerr<<endl; cerr<<"Time: "<<ed-st<<" ms\n"; cerr<<"Memory: "<<abs(&ST-&ED)/1024.0/1024.0<<" MB\n"; #endif return 0; }