Codeforces Round #729 (Div. 2) 题解

\(\text{CF1542A: Odd Set}\)

\(\mathtt{Description}\)

给定 \(2n\) 个整数,若能将其分成 \(n\) 组,使得每组内的两个数加和为奇数,则输出 Yes,反之输出 No。多测。

\(1\le n\le100\)

\(\mathtt{Solution}\)

考虑分成奇数的情况:每组内必然是一个奇数和一个偶数,所以只需要记录奇数个数和偶数个数,再判断相等即可。

\(\mathtt{Code}\)

void solve() {
  cin >> n ;
  int num1 = 0,num2 = 0;
  for (int i = 1,x; i <= n << 1; ++i) cin >> x,num1 += x % 2,num2 += !(x % 2) ;
  if (num1 == num2) cout << "Yes" << endl ;
  else cout << "No" << endl ;
}

\(\text{CF1542B:Plus and Multiply}\)

\(\mathtt{Description}\)

定义一个拥有无穷元素的集合 \(S\),满足如下条件:

  • \(1\in S\)
  • \(x\in S\rightarrow x\times a \in S,x + b\in S\)

给出 \(n,a,b\),判断 \(n\) 是否在集合中。

\(\mathtt{Solution}\)

当然可以有更简单的方法:直接枚举指数 \(k\),由于 \(k\) 最大为 \(\log_2 10^9\),所以复杂度可以接受。

对于 \(1\) 的情况要特判。

代码并不难打,就不给了,记得开个 long long

\(\text{CF1542C:Strange Function}\)

\(\mathtt{Description}\)

定义函数 \(f(x)\) 为最小的不是 \(x\) 的因数的数。

\(\sum_{x = 1}^nf(x)\)\(10^9 + 7\) 取模的结果

\(1\leq n\leq10^{16}\)

\(\mathtt{Solution}\)

发现大多数的 \(f\) 值都是相同的,这引导我们使用筛法。

由于 \(\max f(x) = 41\),所以我们可以直接枚举 \(f(x)\) 的值,筛去所有不是 \(f(x)\) 的倍数的数。在枚举 \(f(x)=k\) 时,所有的

\[\text{LCM} = \text{lcm}(1,2,\cdots,k-1) \]

的倍数已经筛掉了,所以我们只需要筛 \(\dfrac {k} {\gcd(\text{LCM},k)}\) 即可。

\(\text{CF1542D Priority Queue}\)

\(\mathtt{Description}\)

给初始为空的优先队列和长度为 \(n\) 的操作序列,操作分两种:

  • + x\(x\text{ push}\) 进队列中。
  • - 弹出最小的数。

现在你需要求出按照所有的操作序列的子序列(共有 \(2^n\) 种)对优先队列进行操作之后,队列中的所有可能的最小值加起来的结果,对 \(998244353\) 取模。

\(1\le n\le500\)

\(\mathtt{Solution}\)

考虑 \(\text{dp}\),设 \(f_{i,j}\) 表示对于一个特定的值 \(x\) 来说,考虑前 \(i\) 位,有 \(j\) 个数比 \(x\) 小的方案数。

则分情况讨论:

当第 \(i\) 位为 -

\[f_{i,j} = f_{i-1,j} + f_{i-1,j-1} \]

当第 \(i\)+ 且比 \(x\) 大:

\[f_{i,j} =2\times f_{i-1,j} \]

当第 \(i\)+ 且比 \(x\) 小:

\[f_{i,j} = f_{i-1,j}\quad(j=0) \]

\[f_{i,j} = f_{i-1,j} + f_{i-1,j-1} \quad(j\not= 0) \]

时间复杂度:\(\mathcal O (n^3)\)

\(\text{CF1542E:Abnormal Permutation Pairs}\)

还不太会/kk,咕咕咕。

posted @ 2021-07-21 11:05  feicheng  阅读(59)  评论(0编辑  收藏  举报