Random
Random
https://ac.nowcoder.com/acm/contest/120563/B
链接:https://ac.nowcoder.com/acm/contest/120563/B 来源:牛客网 题目概述 给定一个长度为 n 的数组,需要找到任意两个不同位置的元素,使得它们的最大公约数大于 1。存在则输出这两个元素的值,否则输出 -1。 思路分析 简单思考可知,只要两个数有任何一个公共质因子,它们的 gcd 就会大于 1。而题目不要求最优或特定解,只需找到任意一对即可,这意味着一旦发现符合条件的数对,就可以立刻终止。因此,暴力枚举是简单且有效的解法。 总结概括 这道题的核心不在于精巧的数论变换,而在于审题后选择最简单直接的路径。我的代码用二重循环加 gcd,以最朴素的方式完成了任务——它不追求极致的最坏情况复杂度,却在实际评测中干净利落地通过。一句话,枚举数对求公因,找到即止快如风。 C++代码展示如下:
#include <bits/stdc++.h>
using namespace std;
long long gcd(long long x,long long y) {
while(y) {
long long t=x%y;
x=y;
y=t;
}
return x;
}
int main() {
int T;
scanf("%d",&T);
for(int i=0; i<T; i++) {
long long n;
long long J=-1,K=-1;
scanf("%lld",&n);
vector<long long> a(n);
for(long long j=0; j<n; j++) {
scanf("%lld",&a[j]);
}
bool f=false;
for(long long j=0; j<n&&!f; j++) {
for(long long k=j+1; k<n&&!f; k++) {
if(gcd(a[j],a[k])>1) {
J=j,K=k;
f=true;
break;
}
}
}
if(f) {
printf("%lld %lld\n",a[J],a[K]);
} else {
printf("-1\n");
}
}
return 0;
}
查看2道真题和解析