题意:给出n个数,问这n个数的乘积中最小的有至少三个因子的因子。
解法:除了1和质数的正整数都有至少三个因子,所以只要求那个乘积里最小的不为1的非质数因子就可以了,对每个数分解质因子,所有质因子中最小的两个之积即为答案,如果找不到两个质因子则不存在答案。注意longlong!注意longlong!注意longlong!重要的事情说三遍。
代码:
#include<stdio.h> #include<iostream> #include<algorithm> #include<string> #include<string.h> #include<math.h> #include<limits.h> #include<time.h> #include<stdlib.h> #include<map> #include<queue> #include<set> #include<stack> #include<vector> #define LL long long using namespace std; int cnt = 0; int prime[45000]; void init() { bool isprime[45005] = {0}; for(int i = 2; i <= 45000; i++) { if(!isprime[i]) { prime[cnt++] = i; for(int j = i + i; j <= 45000; j += i) isprime[j] = 1; } } } int main() { init(); int T; while(~scanf("%d", &T)) { while(T--) { int n; int a[105]; vector <int> v; scanf("%d", &n); for(int i = 0; i < n; i++) { scanf("%d", &a[i]); int j = 0; int x = a[i]; int flag = 0; for(j = 0; j < cnt && a[i] >= prime[j]; j++) { while(a[i] % prime[j] == 0) { v.push_back(prime[j]); flag = 1; a[i] /= prime[j]; } } if(!flag && x != 1) v.push_back(x); } sort(v.begin(), v.end()); //for(int i = 0; i < v.size(); i++) //cout << v[i] << endl; if(v.size() < 2) printf("-1\n"); else printf("%lld\n", (LL)v[0] * v[1]); } } return 0; }
时间: 2024-10-10 23:23:12