#找规律 #质因数分解 ## 题目大意 有 $n$ 个元素,第 $i$ 个元素的值是 $a_i$。对于任意一对 $(i,j)$ $(1\le i,j\le n)$,你可以选择一个整数 $x$,将 $a_i$ 乘上 $x$,将 $a_j$ 除以 $x$,最后使得所有的元素都是一个值。问你可不可以完成这个操作。 ## 思路 首先找规律,我们可以发现将 $a_i$ 分解质因数后,若每一种质因子的数量都是 $n$ 的倍数的话,那么就代表可以化为同一个元素。因为如果是 $n$ 的倍数的话,那么这个质因子就可以互相传递,那么假设数量为 $s$,每一个元素就得到了 $n\div s$,就可以达到判断是否能够达到同一个元素的效果。 现在我们就需要快速分解质因数。假设我们需要分解 $x$,可以考虑分两种情况: - $x$ 本身就是质数:直接把 $x$ 分离出来; - $x$ 是合数:枚举 $x$ 的质因子,并直接进行分解。 然后我们使用一个 `map` 存下每一个质因子的数量,最后对 `map` 里面的值进行判断。 ## 代码 ```cpp #include <iostream> #include <map> using namespace std; const int kMaxN = 1e4 + 5; int a[kMaxN], t, n; map<int, int> f; int main() { for (cin >> t; t; t--) { cin >> n, f.clear(); for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { for (int j = 2; j * j <= a[i]; j++) { for (; a[i] % j == 0; a[i] /= j) { f[j]++; } } if (a[i] != 1) { f[a[i]]++; } } bool ans = 1; for (auto i : f) { ans &= i.second % n == 0; } cout << (ans ? "YES" : "NO") << '\n'; } return 0; } ```