結果

問題 No.2219 Re:010
ユーザー prism17prism17
提出日時 2023-02-18 12:04:26
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 2,633 bytes
コンパイル時間 1,553 ms
コンパイル使用メモリ 169,492 KB
実行使用メモリ 16,128 KB
最終ジャッジ日時 2024-07-19 23:23:41
合計ジャッジ時間 2,665 ms
ジャッジサーバーID
(参考情報)
judge3 / judge5
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 6 ms
6,528 KB
testcase_01 AC 6 ms
6,528 KB
testcase_02 AC 6 ms
6,528 KB
testcase_03 WA -
testcase_04 WA -
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 WA -
testcase_14 WA -
testcase_15 WA -
testcase_16 WA -
testcase_17 WA -
testcase_18 AC 16 ms
16,128 KB
testcase_19 AC 17 ms
16,000 KB
testcase_20 WA -
testcase_21 AC 6 ms
6,528 KB
testcase_22 AC 6 ms
6,656 KB
testcase_23 AC 6 ms
6,528 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

// Problem: No.2219 Re:010
// Contest: yukicoder
// URL: https://yukicoder.me/problems/no/2219
// Memory Limit: 512 MB
// Time Limit: 2000 ms

#include <bits/stdc++.h>

#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
#define dbg(x) cout << #x << " = " << (x) << "\n";
#define popcount(x) __builtin_popcountll((x))
#define all(v) (v).begin(), (v).end()
#define pb emplace_back
#define x first
#define y second

using namespace std;
typedef long long ll;
typedef pair<ll, ll> pll;
const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const int mod = 1e9 + 7;
namespace COM {
ll ksm(ll x, ll n) {
  ll res = 1;
  while (n) {
    if (n & 1) res = (res * x) % mod;
    x = x * x % mod;
    n >>= 1;
  }
  return res;
}
ll inv(ll x) { return ksm(x, mod - 2); }
ll fac[N], invfac[N];
void init() {
  fac[0] = 1;
  for (int i = 1; i < N; ++i) fac[i] = (fac[i - 1] * i) % mod;
  invfac[N - 1] = inv(fac[N - 1]);
  for (int i = N - 2; i >= 0; --i) invfac[i] = (invfac[i + 1] * (i + 1)) % mod;
}
ll C(int n, int m) {
  if (n < m || m < 0) return 0;
  return fac[n] * invfac[m] % mod * invfac[n - m] % mod;
}
}  // namespace COM

char str[N];
ll l0[N], lq[N], r0[N], rq[N], l1[N], r1[N];
int n;

void solve() {
  COM::init();
  cin >> str + 1;
  n = strlen(str + 1);
  for (int i = 1; i <= n; i++) {
    l1[i] = l1[i - 1] + (str[i] == '1');
    l0[i] = l0[i - 1] + (str[i] == '0');
    lq[i] = lq[i - 1] + (str[i] == '?');
  }
  for (int i = n; i >= 1; i--) {
    r1[i] = r1[i + 1] + (str[i] == '1');
    r0[i] = r0[i + 1] + (str[i] == '0');
    rq[i] = rq[i + 1] + (str[i] == '?');
  }
  ll ans = 0, pre = 0, q1 = 0;
  for (int i = 1; i <= n; i++) {
    if (str[i] == '?') q1 = (q1 + l0[i - 1] * r0[i + 1] + pre) % mod;
    if (str[i] == '1') pre += l0[i];
  }
  pre = 0;
  for (int i = n; i >= 1; i--) {
    if (str[i] == '?') q1 = (q1 + pre) % mod;
    if (str[i] == '1') pre += r0[i];
  }
  ans = q1 * COM::C(2, lq[n] - 1) % mod;
  ll q0 = 0;
  for (int i = n; i >= 1; i--) {
    if (str[i] == '1') q0 = q0 + (l0[i] * r0[i]) % mod;
  }
  ans = ans + q0 * COM::ksm(2, lq[n]) % mod;
  ans %= mod;
  ll q2 = 0;
  for (int i = 1; i <= n; i++) {
    if (str[i] == '1') {
      q2 = (q2 + lq[i] * rq[i]) % mod;
    }
    if (str[i] == '0') {
      q2 = (q2 + COM::C(lq[i], 2)) % mod;
      q2 = (q2 + COM::C(rq[i], 2)) % mod;
    }
  }
  if (lq[n] >= 2) {
    ans = ans + q2 * COM::ksm(2ll, lq[n] - 2);
  }
  ans %= mod;
  if (lq[n] >= 3) ans = ans + COM::C(lq[n], 3) * COM::ksm(2, lq[n] - 3);
  ans %= mod;
  cout << ans << "\n";
}

int main() {
  fastio;
  int t = 1;
  // cin >> t;
  while (t--) {
    solve();
  }
  return 0;
}
0