首页 > 其他分享 >CF1930E 2..3...4.... Wonderful! Wonderful! 题解

CF1930E 2..3...4.... Wonderful! Wonderful! 题解

时间:2024-02-25 11:11:20浏览次数:27  
标签:kMod return ifac ... int 题解 leq Wonderful bs

Description

Stack has an array $ a $ of length $ n $ such that $ a_i = i $ for all $ i $ ( $ 1 \leq i \leq n $ ). He will select a positive integer $ k $ ( $ 1 \leq k \leq \lfloor \frac{n-1}{2} \rfloor $ ) and do the following operation on $ a $ any number (possibly $ 0 $ ) of times.

  • Select a subsequence $ ^\dagger $ $ s $ of length $ 2 \cdot k + 1 $ from $ a $ . Now, he will delete the first $ k $ elements of $ s $ from $ a $ . To keep things perfectly balanced (as all things should be), he will also delete the last $ k $ elements of $ s $ from $ a $ .

Stack wonders how many arrays $ a $ can he end up with for each $ k $ ( $ 1 \leq k \leq \lfloor \frac{n-1}{2} \rfloor $ ). As Stack is weak at counting problems, he needs your help.

Since the number of arrays might be too large, please print it modulo $ 998,244,353 $ .

$ ^\dagger $ A sequence $ x $ is a subsequence of a sequence $ y $ if $ x $ can be obtained from $ y $ by deleting several (possibly, zero or all) elements. For example, $ [1, 3] $ , $ [1, 2, 3] $ and $ [2, 3] $ are subsequences of $ [1, 2, 3] $ . On the other hand, $ [3, 1] $ and $ [2, 1, 3] $ are not subsequences of $ [1, 2, 3] $ .

\(3\leq n\leq 10^6\) .

Solution

不妨设 \(x\) 为总共删的数的个数,\(p_i\) 表示 \(i\) 是否被删,考虑什么样的序列是合法的。

  1. \(x=2k\),则充要条件为存在 \(i\) 使得 \(p_i=0\) 且 \(i\) 之前和之后都有恰好 \(k\) 个 \(1\)。

  2. \(x>2k\),则如果不存在一个 \(i\) 使得 \(p_i=0\) 且 \(i\) 之前和之后都有至少 \(k\) 个 \(1\),那么最后一步一定不合法。如果一定存在,那么可以先把左右两边的 \(1\) 的个数删成 \([k,3k)\) 然后就必然合法。

所以一个序列合法的条件为存在一个 \(i\) 使得 \(p_i=0\) 且 \(i\) 之前和之后都有至少 \(k\) 个 \(1\)。

考虑用总数减去不合法的方案数,先把 \(2x\) 个 \(1\) 插进去,然后每个 \(0\) 只能插入左右各 \(k\) 个空,总方案数即为:

\[\binom{n}{x}-\binom{n-x+2k-1}{2k-1} \]

时间复杂度:\(O(n\log n)\)。

Code

#include <bits/stdc++.h>

// #define int int64_t

const int kMaxN = 1e6 + 5, kMod = 998244353;

int n;
int fac[kMaxN], ifac[kMaxN], inv[kMaxN];

constexpr int qpow(int bs, int64_t idx = kMod - 2) {
  int ret = 1;
  for (; idx; idx >>= 1, bs = (int64_t)bs * bs % kMod)
    if (idx & 1)
      ret = (int64_t)ret * bs % kMod;
  return ret;
}

inline int add(int x, int y) { return (x + y >= kMod ? x + y - kMod : x + y); }
inline int sub(int x, int y) { return (x >= y ? x - y : x - y + kMod); }
inline void inc(int &x, int y) { (x += y) >= kMod ? x -= kMod : x; }
inline void dec(int &x, int y) { (x -= y) < 0 ? x += kMod : x; }

int C(int m, int n) {
  if (m < n || m < 0 || n < 0) return 0;
  return 1ll * fac[m] * ifac[n] % kMod * ifac[m - n] % kMod;
}

void prework() {
  fac[0] = ifac[0] = fac[1] = ifac[1] = inv[1] = 1;
  for (int i = 2; i <= 1e6; ++i) {
    inv[i] = 1ll * (kMod - kMod / i) * inv[kMod % i] % kMod;
    fac[i] = 1ll * i * fac[i - 1] % kMod;
    ifac[i] = 1ll * inv[i] * ifac[i - 1] % kMod;
  }
}

int solve(int n, int k) {
  int ret = 1;
  for (int i = 2 * k; i <= n; i += 2 * k) {
    inc(ret, sub(C(n, i), C(n - i + 2 * k - 1, 2 * k - 1)));
  }
  return ret;
}

void dickdreamer() {
  std::cin >> n;
  for (int i = 1; i <= (n - 1) / 2; ++i)
    std::cout << solve(n, i) << ' ';
  std::cout << '\n';
}

int32_t main() {
#ifdef ORZXKR
  freopen("in.txt", "r", stdin);
  freopen("out.txt", "w", stdout);
#endif
  std::ios::sync_with_stdio(0), std::cin.tie(0), std::cout.tie(0);
  int T = 1;
  std::cin >> T;
  prework();
  while (T--) dickdreamer();
  // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
  return 0;
}

标签:kMod,return,ifac,...,int,题解,leq,Wonderful,bs
From: https://www.cnblogs.com/Scarab/p/18032168

相关文章

  • [ARC155D] Avoid Coprime Game 题解
    Description非负整数\(x,y\)的最大公约数记为\(\gcd(x,y)\),规定\(\gcd(x,0)=\gcd(0,x)=x\)。黑板上写了\(N\)个整数\(A_1,A_2,...,A_N\),这\(N\)个数的最大公约数是\(1\)。Takahashi和Aoki在玩游戏,有一个变量\(G\)初值为\(0\),他们轮流进行以下操作:从黑板上选择......
  • 2024牛客寒假算法基础集训营4个人补题题解(B、E)
    B、左右互博不能操作的情况有且仅有所有石子堆的石子个数只有1的时候,因此不管途中怎么操作,让所有石子堆都变成1的总操作次数是确定的。即假设一共有\(n\)堆石子,石子总数为\(sum\),总操作次数为\((sum-n)\)次。因此当\((sum-n)\)%\(2=0\)时一定在sweet操作完(或没有操作)后gui无法......
  • 元宵节快乐......在此写下纪念
    一晃时间过了许久,不知不觉自己学习网安行业已经快一年了,在此遇见很多的人,给我许多帮助,指点迷津,非常感谢!!奈何自己愚笨,靠着没日没夜的学习才能有一丝丝前进的可能,有时候会埋怨自己真的是太笨了,但还是得起身,奋起原来少年已经是一个青年啦,意气风发的时候,一去不复返咯~只能埋下头去好......
  • CF1832B Maximum Sum 题解
    【题目描述】给定一个长度为\(n\)的数列,其中每个元素互不相同,进行\(k\)次操作,每次可以选择删除序列中最小的两个数或最大的一个数。求操作后剩余数的和的最大值。【思路】我们构造一组数据:首先我们看到题目中的一句话:每次可以选择删除序列中最小的两个数或最大的一个数。......
  • CF1857B Maximum Rounding 题解
    题目描述给定一个自然数\(n\),可以对任意一位进行四舍五入,可以进行任意次,求能得到的最大数。(这里的\(n\)没有前导零)思路首先我们发现,如果我们将其中一位进位了,那后面的所有位都会变成\(0\),因此,如果我们进位了两次,那么位置靠后的那次进位,其实是没有用的。所以我们要从高位往......
  • CF1857G Counting Graphs 题解
    题目描述给定一棵最小生成树,求有多少张图的最小生成树是给定的树,并且这张图的所有边边权不超过\(S\)。思路考虑在最小生成树中加边。我们回顾一下Kruskal的过程:找到没被用过的,最小的边判断这条边的两端是否在一个联通块中加入这条边,将两端的联通块连在一起根据第三条......
  • P9562 [SDCPC2023] G-Matching 题解
    题目描述给定长度为\(n\)的整数序列\(a_1,a_2,\cdots,a_n\),我们将从该序列中构造出一张无向图\(G\)。具体来说,对于所有\(1\lei<j\len\),若\(i-j=a_i-a_j\),则\(G\)中将存在一条连接节点\(i\)与\(j\)的无向边,其边权为\((a_i+a_j)\)。求\(G\)的一个......
  • CF1832B Maximum Sum 题解
    【题目描述】给定一个长度为\(n\)的数列,其中每个元素互不相同,进行\(k\)次操作,每次可以选择删除序列中最小的两个数或最大的一个数。求操作后剩余数的和的最大值。【思路】我们构造一组数据:首先我们看到题目中的一句话:每次可以选择删除序列中最小的两个数或最大的一个数。......
  • P4569 [BJWC2011] 禁忌 题解
    题目传送门前置知识AC自动机|矩阵加速递推解法对于一段固定的文本串,由于重叠的模式串不对伤害产生贡献,故考虑贪心,每碰到出现一个模式串将其分为一段,最终这个文本串的伤害就是划分次数。类似luoguP3193[HNOI2008]GT考试,令\(f_{i,j}\)表示前\(i\)个字符,当前运行到......
  • AT_abc341_g [ABC341G] Highest Ratio 题解
    题目传送门前置知识单调栈简化题意给定一个长度为\(n\)的序列\(a\)。对于所有的\(l(1\lel\len)\),均求出\(\max\limits_{r=l}^{n}\{\frac{\sum\limits_{i=l}^{r}a_{i}}{r-l+1}\}\)。解法令\(sum_{i}=\sum\limits_{j=1}^{i}a_{j},P_{i}=(i,sum_{i})\),则有\(\beg......