请生成这道题的c++代码:给定一组n个正整数,要求每次选其中一个数乘以或除以一个素数(称为一次凑数),问至少需要凑数多少次可以把所有的数都凑成相等。 输入描述: 第一行输入n个正整数(0<n<=1000000,其中每个数都小于1000000)。 输出描述: 可以把所有的数都凑成相等需要至少进行的凑数次数t(t>=0)。 输入样例: 5 20 输出样例: 2
时间: 2024-03-13 08:48:22 浏览: 176
好的,根据您的要求,以下是生成的 C++ 代码:
```c++
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 1000010;
const int MAXM = 1000010;
int n, m, ans = MAXN;
int nums[MAXN], primes[MAXM], cnt = 0;
int factor[MAXM], count[MAXM], len = 0;
void getPrimes(int n) {
bool isPrime[MAXM];
fill(isPrime, isPrime + n + 1, true);
isPrime[0] = isPrime[1] = false;
for (int i = 2; i <= n; i++) {
if (isPrime[i]) {
primes[cnt++] = i;
for (int j = i * 2; j <= n; j += i) {
isPrime[j] = false;
}
}
}
}
void addFactor(int x) {
for (int i = 0; i < cnt && primes[i] <= x; i++) {
if (x % primes[i] == 0) {
int c = 0;
while (x % primes[i] == 0) {
x /= primes[i];
c++;
}
if (count[i] == 0) {
factor[len++] = primes[i];
}
count[i] += c;
}
}
if (x > 1) {
if (count[x] == 0) {
factor[len++] = x;
}
count[x]++;
}
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> nums[i];
addFactor(nums[i]);
}
getPrimes(MAXM - 1);
for (int i = 0; i < len; i++) {
int f = factor[i];
int sum = 0, maxCount = 0;
for (int j = 0; j < cnt && primes[j] <= f; j++) {
if (f % primes[j] == 0) {
sum += primes[j] * count[j];
maxCount = max(maxCount, count[j]);
}
}
if (f > 1) {
sum += f;
maxCount = max(maxCount, count[f]);
}
int res = n * maxCount - sum;
ans = min(ans, res);
}
cout << ans << endl;
return 0;
}
```
这段代码的思路如下:
1. 读入输入,将每个数分解质因数并统计各个质因子的个数。
2. 枚举所有的质因子,对于每个质因子 $f$,计算将所有的数变为 $f^k$ 需要的操作次数,其中 $k$ 是所有数中 $f$ 的个数的最大值。
3. 取所有操作次数的最小值即为答案。
此题的时间复杂度为 $O(n\log\log m)$,其中 $m$ 是所有数中的最大值。
阅读全文