首页 > 其他分享 >[ARC155D] Avoid Coprime Game 题解

[ARC155D] Avoid Coprime Game 题解

时间:2024-02-25 10:14:48浏览次数:17  
标签:cnt gcd leq int 题解 Avoid kMaxN 必胜 Coprime

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\),他们轮流进行以下操作:

从黑板上选择一个数 \(a\),必须满足 \(\gcd(a,G)\ne 1\),从黑板上擦掉这个数,并将 \(G\) 的值改为 \(\gcd(a,G)\)。

Takahashi 先手,谁无法操作就输了,两人都采取最优策略。

请你对于 \(i=1,2,..,N\) 分别判断,假如第一步 Takahashi 选择的数是 \(A_i\),最后谁会获胜。

  • $ 2\ \leq\ N\ \leq\ 2\ \times\ 10^5 $
  • $ 2\ \leq\ A_i\ \leq\ 2\ \times\ 10^5 $

Code

考虑对于必胜必败态进行 dp,不妨设当前 gcd 为 \(G\),注意到删数很难用状态表示,但是发现删掉的数一定是当前 \(G\) 的倍数,而其他 \(G\) 的倍数与 \(G\) 的 gcd 还是 \(G\),并且不是 \(G\) 的倍数的数一定没被删。

所以只要记录 \(G\) 和当前轮数即可刻画这个状态,显然过不了。


先考虑每次 \(G\) 一定会变小的情况,设 \(f_i\) 表示 \(G=i\) 是否必胜/必败,\(cnt_i\) 表示 \(i\) 的倍数的个数。

那么枚举一个 \(j\) 使得 \(\exists x,gcd(i,x)=j\),如果 \(f_j\) 为必败,则 \(f_i\) 必胜。如果所有 \(j\) 全必胜,则 \(f_i\) 必败。

但是这题 \(G\) 不一定会变小,考虑什么情况下 \(G\) 不会变小。

注意到如果存在一个 \(f_j(j<i)\) 满足其是必败态,则当前操作一定最优。所以 \(G\) 不变小当且仅当所有转移到的 \(f_j\) 都必胜,则两人一定不停操作直到必须变小,即操作到 \(cnt_i\) 轮的人会必胜。

所以只要记录一维状态表示当前操作了奇数/偶数轮,\(f_{i,0/1}\) 表示当前 \(G=i\),在这之前操作了偶数/奇数轮。

然后同样进行 dp,如果后继状态全必胜,则 \(f_{i,1-(cnt_i\bmod 2)}\) 必胜。

时间复杂度:\(O(V\log^2 V+N)\)。

Code

#include <bits/stdc++.h>

// #define int int64_t

const int kMaxN = 2e5 + 5;

int n;
int a[kMaxN], cnt[kMaxN], tmp[kMaxN];
bool f[kMaxN][2];
std::vector<int> d[kMaxN];

void dickdreamer() {
  std::cin >> n;
  for (int i = 1; i <= n; ++i) {
    std::cin >> a[i];
    ++cnt[a[i]];
  }
  for (int i = 2; i <= 2e5; ++i) {
    d[i].emplace_back(i);
    for (int j = 2 * i; j <= 2e5; j += i)
      cnt[i] += cnt[j], d[j].emplace_back(i);
  }
  for (int i = 2; i <= 2e5; ++i) {
    bool fl = 0;
    for (auto j : d[i]) tmp[j] = cnt[j];
    for (int j = (int)d[i].size() - 1; ~j; --j) {
      int x = d[i][j];
      if (x != i && tmp[x]) {
        if (!f[x][0]) f[i][1] = 1, fl = 1;
        if (!f[x][1]) f[i][0] = 1, fl = 1;
      }
      for (auto k : d[x]) tmp[k] -= tmp[x];
    }
    if (!fl) f[i][~cnt[i] & 1] = 1;
  }
  for (int i = 1; i <= n; ++i) {
    std::cout << (f[a[i]][1] ? "Aoki\n" : "Takahashi\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;
  while (T--) dickdreamer();
  // std::cerr << 1.0 * clock() / CLOCKS_PER_SEC << "s\n";
  return 0;
}

标签:cnt,gcd,leq,int,题解,Avoid,kMaxN,必胜,Coprime
From: https://www.cnblogs.com/Scarab/p/18032074

相关文章

  • 2024牛客寒假算法基础集训营4个人补题题解(B、E)
    B、左右互博不能操作的情况有且仅有所有石子堆的石子个数只有1的时候,因此不管途中怎么操作,让所有石子堆都变成1的总操作次数是确定的。即假设一共有\(n\)堆石子,石子总数为\(sum\),总操作次数为\((sum-n)\)次。因此当\((sum-n)\)%\(2=0\)时一定在sweet操作完(或没有操作)后gui无法......
  • [ARC155D] Avoid Coprime Game
    考虑a的范围其实很小,只有2e5,也就代表着G最大只有2e5,不难发现对于G的质因数分解,一个质因子的幂次对G没有影响,而G最多只有6个本质不同质因子,也就是G最多只有\(2^6\)种考虑建出博弈论转移的DAG,首先对于G不变的操作(也就是选的数拥有G的所有类型的质因子),只有两种本质不同的状态:1.先......
  • 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......
  • P10139 [USACO24JAN] Nap Sort G 题解
    DescriptionBessie正在尝试使用她自己的排序算法对一个整数数组进行排序。她有一堆共\(N\)(\(1\leN\le2\cdot10^5\))个整数\(a_1,a_2,\ldots,a_N\)(\(1\lea_i\le10^{11}\)),她将会按排序顺序将这些数放入一个单独的数组中。她反复查找这堆数中的最小数,将其删除,同时将其添加到......