結果
問題 | No.2219 Re:010 |
ユーザー |
![]() |
提出日時 | 2025-01-22 12:18:14 |
言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 475 ms / 2,000 ms |
コード長 | 1,258 bytes |
コンパイル時間 | 2,339 ms |
コンパイル使用メモリ | 157,956 KB |
実行使用メモリ | 10,112 KB |
最終ジャッジ日時 | 2025-01-22 12:18:23 |
合計ジャッジ時間 | 5,965 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 21 |
ソースコード
#include <bits/stdc++.h> #define int long long #define c1 cout << 1 << " " #define cen cout << endl #define mod %998244353LL using namespace std; long long q=998244353; long long mpow(long long a,long long b){ if(b==1){ return a; } if(b==0){ return 1; } if(b%2==0){ long long s=mpow(a,b/2)%q; return s%q*s%q; } else{ long long s=mpow(a,b/2)%q; return s%q*s%q*a%q; } } int ar[200009]={0}; int ar1[200009]={0}; int br[200009]={0}; int br1[200009]={0}; signed main(){ string str; cin >> str; str=" "+str; for(int i=1;i<str.size();i++){ ar[i]=ar[i-1]+(str[i]=='0'); ar1[i]=ar1[i-1]+(str[i]=='?'); // c1; } for(int i=str.size()-1;i>=1;i--){ br[i]=br[i+1]+(str[i]=='0'); br1[i]=br1[i+1]+(str[i]=='?'); } int sum=0; int num=br1[1]; for(int i=2;i<str.size()-1;i++){ if(str[i]=='1'||str[i]=='?'){ if(str[i]=='?'){ num--; } sum+=(ar[i-1] mod*br[i+1] mod*mpow(2,num)) mod; if(ar1[i-1]!=0){ sum+=(ar1[i-1] mod*br[i+1] mod*mpow(2,num-1)) mod; } if(br1[i+1]!=0){ sum+=(ar[i-1] mod*br1[i+1] mod*mpow(2,num-1)) mod; } if(ar1[i-1]!=0&&br1[i+1]!=0){ sum+=(ar1[i-1] mod*br1[i+1] mod*mpow(2,num-2)) mod; } sum=sum mod; if(str[i]=='?'){ num++; } } } cout << sum; return 0; }