結果
問題 | No.2040 010-1 Deletion |
ユーザー |
![]() |
提出日時 | 2022-08-12 22:23:10 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 121 ms / 3,000 ms |
コード長 | 5,295 bytes |
コンパイル時間 | 2,198 ms |
コンパイル使用メモリ | 200,176 KB |
最終ジャッジ日時 | 2025-01-30 21:17:03 |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 33 |
ソースコード
#include <bits/stdc++.h>using namespace std;#define rep(i,n) for(int i = 0; i < int(n); i++)#define per(i,n) for(int i = (n) - 1; 0 <= i; i--)#define rep2(i,l,r) for(int i = (l); i < int(r); i++)#define per2(i,l,r) for(int i = (r) - 1; int(l) <= i; i--)#define MM << " " <<#define pb push_back#define eb emplace_back#define all(x) begin(x), end(x)#define rall(x) rbegin(x), rend(x)#define sz(x) (int)x.size()template <typename T>void print(const vector<T> &v, T x = 0) {int n = v.size();for (int i = 0; i < n; i++) cout << v[i] + x << (i == n - 1 ? '\n' : ' ');if (v.empty()) cout << '\n';}using ll = long long;using pii = pair<int, int>;using pll = pair<ll, ll>;template <typename T>bool chmax(T &x, const T &y) {return (x < y) ? (x = y, true) : false;}template <typename T>bool chmin(T &x, const T &y) {return (x > y) ? (x = y, true) : false;}// const ll MOD = 1'000'000'007;const ll MOD = 998'244'353;///////////////////////////////////////////////////////////////template <class T>using minheap = priority_queue<T, vector<T>, greater<T>>;template <class T>using maxheap = priority_queue<T>;template <typename T>int lb(const vector<T> &v, T x) {return lower_bound(begin(v), end(v), x) - begin(v);}template <typename T>int ub(const vector<T> &v, T x) {return upper_bound(begin(v), end(v), x) - begin(v);}template <typename T>void rearrange(vector<T> &v) {sort(begin(v), end(v));v.erase(unique(begin(v), end(v)), end(v));}struct modint {long long num;const static long long p = 998244353;constexpr static long long pow(long long n, long long k) {//n^k(mod p)n %= p;long long ret = 1;while(k) {if(k&1) ret = ret * n % p;n = n * n % p;k >>= 1;}return ret;}// a*A + b*B = 1constexpr static void euclid(long long &a, long long &b) { // a>=b A*b+B*(a-a/b*b)=1if (a == 1) {a = 1;}else {long long A = b, B = a % b;euclid(A, B);b = (A - (p + a / b) % p * B % p + p) % p;a = B;}}constexpr static long long rev(const long long n) {// n*x-p*y=1//long long q = p;//euclid(p, n, p);//return n % q;return pow(n,p-2);}constexpr modint() : num(0) {}constexpr modint(long long x) : num(x%p < 0 ? x%p+p : x%p) {}constexpr modint inv() const {return rev(num);}modint operator-() const {return modint(p-num);}modint& operator+=(const modint &other){num = (num + other.num) % p;return *this;}modint& operator-=(const modint &other){num = (num - other.num + p) % p;return *this;}modint& operator*=(const modint &other){num = (num * other.num) % p;if(num < 0) num += p;return *this;}modint& operator/=(const modint &other){(*this) *= other.inv();return *this;}modint& operator+=(const long long &other){num = (num + other) % p;return *this;}modint& operator-=(const long long &other){num = (num - other + p) % p;return *this;}modint& operator*=(const long long &other){num = (num * (other % p)) % p;return *this;}modint& operator/=(const long long &other){(*this) *= rev(other);return *this;}modint& operator++(){return *this += 1;}modint& operator--(){return *this -= 1;}modint& operator=(const long long &other){return (*this) = modint(other);}modint operator+(const modint &other) const{return modint(*this) += other;}modint operator-(const modint &other) const{return modint(*this) -= other;}modint operator*(const modint &other) const{return modint(*this) *= other;}modint operator/(const modint &other) const{return modint(*this) /= other;}modint operator+(const long long &other) const{return modint(*this) += other;}modint operator-(const long long &other) const{return modint(*this) -= other;}modint operator*(const long long &other) const{return modint(*this) *= other;}modint operator/(const long long &other) const{return modint(*this) /= other;}bool operator==(const modint &other) const{return num == other.num;}};std::istream& operator>>(std::istream &is, modint x) {is >> x.num;return is;}std::ostream& operator<<(std::ostream &os, const modint &x){os << x.num;return os;}int main() {int n; cin >> n;string s; cin >> s;vector<vector<modint>> dp1(n+1, vector<modint>(n*3+3));vector<vector<modint>> dp2(n+1, vector<modint>(n*3+3));dp2[0][n*2+2] += 1;rep(i,n) {if(s[i] != '0') {rep(j,n*3+3) {dp2[i+1][j] += dp2[i][j];if(j > 1) dp2[i+1][j-2] += dp1[i][j];}}if(s[i] != '1') {rep(j,n*3+2) {dp1[i+1][j+1] += dp1[i][j] + dp2[i][j];}}}modint ans = dp1.back()[n*2+2];for(int i = 0; i <= n*2; i+=2) {ans += dp1.back()[i] + dp2.back()[i];}if(s.find('0') == string::npos) ans += 1;cout << ans << endl;}