.article-info-tag,button{text-transform:uppercase}.day,.postMeta,.postSticky{position:relative}.postTitle a:link,html{-webkit-tap-highlight-color:transparent}#blog-calendar,.code-copay-btn,.code-hljs-len,.hidden{visibility:hidden}#EntryTag,#blogTitle h1{margin-top:20px}#EntryTag a,.postSticky{background:#6fa3ef}#blogTitle h1 a:hover,.dayTitle a,a,a:active,a:link,a:visited{color:#5c8ec6}#calendar table a:hover,#navList a:hover,.postDesc a:hover,a:active,a:hover,a:link,a:visited,button{text-decora…ryTag a:visited{color:#666}#BlogPostCategory a,#EntryTag a{height:20px;line-height:20px;color:#fff!important;padding:3px 5px;border-radius:3px;margin:2px 5px 0;text-decoration:none;font-size:14px}#BlogPostCategory a:hover,#EntryTag a:hover{transition:all .3s linear 0s;opacity:.8}#topics .postDesc{padding-left:0;width:100%;text-align:left;color:#666;margin-top:5px;background:0 0}.feedbackListSubtitle-louzhu:after,.feedbackListSubtitle:after,.feedbackListSubtitle:before{top:11px;right:100%;left:-1

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  阅读(28)  评论(0编辑  收藏  举报