蓝桥杯2023年第十四届省赛真题-公因数匹配
给定 n 个正整数 Ai,请找出两个数 i, j 使得 i < j 且 Ai 和 Aj 存在大于 1 的公因数。
如果存在多组 i, j,请输出 i 最小的那组。如果仍然存在多组 i, j,请输出 i 最小的所有方案中 j 最小的那组。
笔记:
分解质因数、分解因数(需要学习⭐⭐)
算数基本定理:任何一个正整数都可以拆成若干个质数的乘积。
#include <iostream>
#include<bits/stdc++.h>
#define int long long
#define INF 0x3f3f3f3f
using namespace std;
//st[i]表示包含质因子i的数字组成的数组
//st[i]={1,2};
map<int, vector<int>>st;
int cnt=0;
void prim(int x,int pos)
{
for(int i=2;i<=x/i;i++){
if(x%i)//不等于0说明不是它的一个因子
continue;
st[i].push_back(pos);
while(x%i==0){//把这个因子都除掉后再看下一个因子
x/=i;
}
}
if(x>1){
st[x].push_back(pos);
}
return ;
}
void solve()
{
int n;cin>>n;
for(int i=1;i<=n;i++){
int x;cin>>x;
prim(x,i);//分解质因子
}
pair<int,int>ans={INF,INF};
for(auto[x,y]:st){
if(y.size()<2){
continue;
}
if(y[0]<ans.first){
ans={y[0],y[1]};
}else if (y[0]==ans.first){
if(y[1]<ans.second){
ans={y[0],y[1]};
}
}
}
cout<<ans.first<<" "<<ans.second<<endl;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int t;
t=1;
//cin>>t;
while(t--)
solve();
}