#include using namespace std; const int MOD = 998244353; int main() { int N; string A; cin >> N >> A; // dp0: 現在の位置まで処理済みで、左から1の伝播が「開いていない」状態の通り数 // dp1: 左から1の伝播が「開いている」(以降を1に強制可能)状態の通り数 long long dp0 = 1, dp1 = 0; for (int i = 0; i < N; ++i) { long long ndp0 = 0, ndp1 = 0; if (A[i] == '1') { // 1の場合 // 状態0から:広げない → ndp0、広げる → ndp1 ndp0 = (ndp0 + dp0) % MOD; ndp1 = (ndp1 + dp0) % MOD; // 状態1から:必ず1になり、伝播継続 → ndp1 ndp1 = (ndp1 + dp1) % MOD; } else { // A[i] == '0' // 0の場合 // 状態1から:左伝播で強制1、伝播継続 → ndp1 ndp1 = (ndp1 + dp1) % MOD; // 状態0から:現在の0を保持 // - 右に広げない → ndp0 // - 右に広げる選択(以後の0に影響)→ ここでは選択肢として +dp0 を ndp0 に加算(独立選択) ndp0 = (ndp0 + dp0) % MOD; // 広げない ndp0 = (ndp0 + dp0) % MOD; // 広げる(選択肢2倍) } dp0 = ndp0; dp1 = ndp1; } long long ans = (dp0 + dp1) % MOD; cout << ans << endl; return 0; }