题意:
给一个序列,设所有项乘积为a,求a的因子中因子个数大于2的最小因子。
解析:
将每个数分解质因子,记录每个质因子的个数。
然后从最小的质因子开始取(累乘),直到取够两个(因为1和其本身也是该数的因子),此时得到的结果就是满足条件的最小因子。
my code
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
typedef long long ll;
const int N = 105;
map<int, int> prime;
map<int, int>::iterator it;
ll a[N];
int n;
void getFactor(ll num) {
for(int i = 2; i*i <= num; i++) {
if(num % i != 0) continue;
while(num % i == 0) {
prime[i]++;
num /= i;
}
}
if(num != 1) prime[num]++;
}
ll modpow(ll a, ll k) {
ll c = 1;
while(k) {
if(k & 1) c *= a;
a *= a;
k >>= 1;
}
return c;
}
ll cal() {
ll ret = 1;
int cnt = 2;
it = prime.begin();
for(; it != prime.end() && cnt > 0; it++) {
ll tmp = (ll)min(cnt, it->second);
cnt -= tmp;
ret *= modpow((ll)(it->first), tmp);
}
return cnt == 0 ? ret : -1;
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
prime.clear();
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%lld", &a[i]);
}
for(int i = 1; i <= n; i++) {
getFactor(a[i]);
}
printf("%lld\n", cal());
}
return 0;
}