結果
| 問題 |
No.2206 Popcount Sum 2
|
| コンテスト | |
| ユーザー |
vjudge1
|
| 提出日時 | 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;
}
vjudge1