結果
問題 |
No.2206 Popcount Sum 2
|
ユーザー |
![]() |
提出日時 | 2025-08-23 15:09:42 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 862 ms / 4,000 ms |
コード長 | 1,408 bytes |
コンパイル時間 | 1,693 ms |
コンパイル使用メモリ | 167,128 KB |
実行使用メモリ | 13,296 KB |
最終ジャッジ日時 | 2025-08-23 15:09:55 |
合計ジャッジ時間 | 12,558 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 18 |
コンパイルメッセージ
main.cpp: In function ‘int main()’: main.cpp:31:14: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 31 | scanf("%lld",&t); | ~~~~~^~~~~~~~~~~ main.cpp:33:22: warning: ignoring return value of ‘int scanf(const char*, ...)’ declared with attribute ‘warn_unused_result’ [-Wunused-result] 33 | scanf("%lld%lld",&a[i].n,&a[i].m); | ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
ソースコード
#include<bits/stdc++.h> using namespace std; #define int long long #define fuck cout<<n<<" "<<m<<" "<<aans<<endl const int mod=998244353; int jc[200010],invjc[200010],ans[200010],aans=2; int L[510],R[510]; int B=340; int qpow(int a,int b){ int res=1; for(;b;b>>=1,a=a*a%mod)res=(res*(b&1?a:1))%mod; return res; } int C(int n,int m){return jc[n]*invjc[n-m]%mod*invjc[m]%mod;} struct node{int n,m,id;}a[200010]; bool cmpn(node x,node y){return x.n<y.n;} bool cmpm(node x,node y){return x.m<y.m;} void deln(int n,int m){aans=(aans+C(n-1,m))*invjc[2]%mod;} void delm(int n,int m){aans=(aans-C(n,m)+mod)%mod;} void addn(int n,int m){aans=(aans*2-C(n,m)+mod)%mod;} void addm(int n,int m){aans=(aans+C(n,m+1))%mod;} signed main(){ jc[0]=jc[1]=1; for(int i=1;i<=2e5;i++){ jc[i]=jc[i-1]*i%mod; invjc[i]=qpow(i,mod-2); } invjc[0]=1; for(int i=1;i<=2e5;i++)invjc[i]=(invjc[i-1]*invjc[i])%mod; int t,res=1; scanf("%lld",&t); for(int i=1;i<=t;i++){ scanf("%lld%lld",&a[i].n,&a[i].m); a[i].n--; a[i].m--; a[i].id=i; } sort(a+1,a+1+t,cmpn); for(int i=1;i<=(t-1)/B+1;i++)sort(a+(i-1)*B+1,a+min(i*B,t)+1,cmpm); int n=1,m=1; for(int i=1;i<=t;i++){ while(n<a[i].n){addn(n,m);n++;} while(m>a[i].m){delm(n,m),m--;} while(n>a[i].n){deln(n,m);n--;} while(m<a[i].m){addm(n,m);m++;} ans[a[i].id]=aans*(qpow(2,a[i].n+1)-1+mod)%mod; } for(int i=1;i<=t;i++)printf("%lld\n",ans[i]); return 0; }