求助 CE
  • 板块灌水区
  • 楼主acauto
  • 当前回复7
  • 已保存回复7
  • 发布时间2024/11/6 18:18
  • 上次更新2024/11/6 20:46:57
查看原帖
求助 CE
1036414
acauto楼主2024/11/6 18:18
#include <bits/stdc++.h>

using namespace std;

#define int long long

int qead() {
  int s = 0, w = 1;
  char c = getchar();
  while (!isdigit(c)) {
    w = (c == '-') ? -w : w;
    c = getchar();
  }
  while (isdigit(c)) {
    s = s * 10 + c - 48;
    c = getchar();
  }
  return s * w;
}
void write(int x) {
  if (x > 9) write(x / 10);
  putchar(x % 10 + 48);
}
void pr(int x) {
  if (x < 0) putchar('-'), x = -x;
  write(x);
}
#define end_ putchar('\n')
#define spc_ putchar(' ')

const int maxN = 2e6 + 7, mod = 998244353;

int ksm(int a, int b = mod - 2) {
  int res = 1;
  while (b) {
    if (b & 1)
      res = res * a % mod;
    a = a * a % mod;
    b >>= 1;
  }
  return res;
}

int n, k, a[maxN];

int fc[maxN], ifc[maxN];
int C(int n, int m) {
  return fc[n] * ifc[m] % mod * ifc[n - m] % mod;
}

using ubt = unsigned long long;
const int BASE = 12345;
ubt H[maxN], S[maxN];
ubt get(int l, int r) {
  return S[r] - S[l - 1] * H[r - l];
}

int s[maxN], p2[maxN];
int calc(int l, int r) {
  return s[r] - s[l - 1] * p2[r - l];
}

void init() {
  fc[0] = 1;
  for (int i = 1; i <= n; i++)
    fc[i] = fc[i - 1] * i % mod;
  ifc[0] = 1;
  int tmp = 1;
  for (int i = 1; i <= n; i++)
    ifc[i] = (tmp = tmp * fc[i] % mod);
  tmp = ksm(tmp);
  for (int i = n; i >= 1; i--)
    ifc[i] = ifc[i - 1] * tmp % mod;
    tmp = tmp * fc[i] % mod;
  }

  H[0] = 1;
  for (int i = 1; i <= n; i++) {
    S[i] = S[i - 1] * BASE + a[i];
    H[i] = H[i - 1] * BASE;
  }
  p2[0] = 1;
  for (int i = 1; i <= n; i++) {
    s[i] = (s[i - 1] * 2 + a[i]) % mod;
    p2[i] = p2[i - 1] * 2 % mod;
  }
}

signed main() {
//  freopen("divide.in", "r", stdin);
//  freopen("divide.out", "w", stdout);

  n = qead(), k = qead();
  for (int i = 1; i <= n; i++)
    scanf("%1lld", &a[i]);
  init();

  if (n == k) {
    int tot = 0;
    for (int i = 1; i <= n; i++)
      tot += a[i];
    pr(tot), spc_, pr(1), end_;
    return 0;
  }
 
  int cnt = 0;
  for (int i = 1; i <= n; i++)
    if (a[i]) break;
    else cnt++;
  if (cnt >= k - 1) {
    int tot = calc(n - cnt + 1, n);
    int ans = 0;
    for (int i = k; i <= n; i++)
      ans = (ans + C(cnt, i - 1)) % mod;
    pr(tot), spc_, pr(ans), end_;
    return 0;
  }
}
2024/11/6 18:18
加载中...