蓝桥杯刷题-12-公因数匹配-数论(分解质因数)不是很理解❓❓

本文介绍了在蓝桥杯省赛中,如何用C++编程解决关于找到具有大于1公因数的正整数对问题,涉及分解质因数和查找算法应用。
摘要由CSDN通过智能技术生成

蓝桥杯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();
}
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值