第一行输入一个整数
代表数组中元素的数量。
第二行输入
个整数
代表数组中的元素。
在一行上输出一个整数,代表最少需要的操作次数。
4 1 1 4 2
1
将第四个数乘
即可,获得
,其中任意两个数的和乘积为完全平方数。
5 1 2 3 4 5
3
#include <bits/stdc++.h> using namespace std; const int MAXA = 1e6+5; int spf[MAXA]; // 最小质因子表 // 线性筛求最小质因子 void sieve() { for (int i = 2; i < MAXA; ++i) spf[i] = 0; for (int i = 2; i < MAXA; ++i) { if (spf[i] == 0) { spf[i] = i; if ((long long)i * i < MAXA) { for (int j = i * i; j < MAXA; j += i) { if (spf[j] == 0) spf[j] = i; } } } } } // 这里用vector存奇质因子,返回一个字符串方便哈希 string getOddPrimeSignature(int x) { unordered_map<int,int> cnt; while (x > 1) { int p = spf[x]; cnt[p]++; x /= p; } vector<int> factors; for (auto &kv : cnt) { if (kv.second % 2 == 1) factors.push_back(kv.first); } sort(factors.begin(), factors.end()); string res; for (int p : factors) res += to_string(p) + ","; return res; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); sieve(); int n; cin >> n; vector<int> a(n); for (int i=0; i<n; i++) cin >> a[i]; unordered_map<string,int> freq; for (int x : a) { string sig = getOddPrimeSignature(x); freq[sig]++; } int maxFreq = 0; for (auto &kv : freq) { maxFreq = max(maxFreq, kv.second); } cout << n - maxFreq << "\n"; return 0; }