The Factor
有一个数列,FancyCoder沉迷于研究这个数列的乘积相关问题,但是它们的乘积往往非常大。幸运的是,FancyCoder只需要找到这个巨大乘积的最小的满足如下规则的因子:这个因子包含大于两个因子(包括它本身;比如,4有3个因子,因此它是满足这个要求的一个数)。你需要找到这个数字并输出它。但是我们知道,对于某些数可能没有这样的因子;在这样的情况下,请输出-1.
输入文件的第一行有一个正整数T (1≤T≤15),表示数据组数。 接下去有T组数据,每组数据的第一行有一个正整数n (1≤n≤100). 第二行有n个正整数a1,…,an (1≤a1,…,an≤2×109), 表示这个数列。
输出T行T个数表示每次询问的答案。
2 3 1 2 3 5 6 6 6 6 6
6 4
题意:给一个数组,数组中每个数字乘起来得到的积,这个积的约数中的约数满足:这个约数的约数的个数大于3。输出满足条件的最小约数,不存在就输出-1.
思路:对于每一个数字,它有用的部分其实只有它的所有质因子(包括相等的)。求出所有数的所有质因子中最小的两个,相乘就是答案。如果所有数字的质因子个数不到两个,那么就是无解。
时间复杂度O(n*sqrt(a))O(n∗sqrt(a))。
CODE:
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#define ll long long
using namespace std;
const int maxn=2000000005;
ll ans[10005];
int main()
{
int t; cin>>t;
while(t--){
int n,num,dex=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&num);
int cnt=0;
for(int i=2;i<=sqrt(num)&&cnt<=2;i++){
while(num%i==0&&cnt<=2){
ans[dex++]=i;
num/=i;
cnt++;
}
}
if(cnt<2&&num!=1)
ans[dex++]=num;
}
if(dex<2)
printf("-1\n");
else{
sort(ans,ans+dex);
ll ret=ans[0]*ans[1];
printf("%I64d\n",ret);
}
}
return 0;
}