Codeforces Round 992 (Div. 2)

Codeforces Round 992 (Div. 2)

这一场打的有点崩, 感冒脑子转不动了, C都是问队友的

A.Game of Division

题意

给定一个数组 a 和数字 k,两个玩家各取一个元素\(a_i\)\(a_j\),若 $ \left| a_i-a_j \right| $ 是 k 的倍数,则玩家二胜利,否则玩家一胜利。
现在玩家一先选择一个 \(a_i\),能否保证玩家一胜利,若能则输出任意一个满足条件的下标 \(i\),否则输出 -1。

思路

如果 $ \left| a_i-a_j \right| $ 是 k 的倍数,则有 $ \left| a_i-a_j \right| % k = \left| a_i % k - a_j % k \right| = 0$,所以我们把所有元素对 k 取模,如果两个元素同模于 k,则说明这两对是不好的。那么我们可以想到,我们需要找的元素应满足 \(\mathbf{a_i}\) 模 k 的余数在数组中是唯一的

C++实现

void solve() {
  int n = read(), k = read();
  vector<int> a(k), dex(k);
  rep(i, 1, n) {
    int x = read() % k;
    a[x] ++;
    dex[x] = i; // 记录下标,如果出现超过两次,就不用在意原本的 w[x] 是否被覆盖
  }
  rep(i, 0, k-1) {
    if (a[i] == 1) {
      puts("Yes");
      write(dex[i]), enter;
      return;
    }
  }
  puts("No");
}

B.Paint a Strip

C.Ordered Permutations

D.Non Prime Tree

posted @ 2024-12-11 14:01  夜霧yoki  阅读(46)  评论(0)    收藏  举报