前置知识:
下列定理证明来自洛谷题解区:
B3715 分解质因子 2 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
学习参考、分解质因数模板:
第二十三章 数论——质数(1)(超级详细的推导)_数论中(1 p)(1 p^2)(1 p^3)成为什么-CSDN博客
题目:
1.公因数匹配 - 蓝桥云课 (lanqiao.cn)
说明:
1.C++库自带求最大公约数的函数,__gcd(a,b)。C++知识精讲8——gcd函数使用方法及实战讲解(例题为求最大公约数)_c++ gcd函数-CSDN博客
2. map的几种遍历方式,有几种方式访问键、值也可以使用first、second:
C++ map遍历的几种方式-CSDN博客
3.分解n的质因数只需要枚举到根号n,然后进行一次特判,判断是不是n的唯一一个大于根号n的质因数。
4.质因数对应的数要有两个才可以,这个判断不要漏了。
讲解视频:
[蓝桥杯]真题讲解:公因数匹配(数论:分解质因数)_哔哩哔哩_bilibili
代码:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+10;
//int a[N];
map<int,vector<int>> p;//对每个数都分解质因数,质因数的map 保存所有含有这个质因数数的索引数组
void prim(int x,int pos){//n最多有一个大于根号n的质因数,且指数为1 for(int i=2;i*i<=x;i++){if(x%i!=0){continue;}p[i].push_back(pos);while(x%i==0){x/=i;}} //特判一下是否存在这样一个于根号n的质因数if(x>1){//cout<<x<<" ";p[x].push_back(pos);}
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int n;// n 个正整数cin>>n;int y;int ans[2];ans[0]=n-1,ans[1]=n;for(int i=1;i<=n;i++){cin>>y;prim(y,i);}//两种map遍历方式,后者要支持C++11标准 // map<int,vector<int>>::iterator it=p.begin();//for(;it!=p.end();it++)
// {
// //注意!:质因数对应至少有两个数才行
// if(it->second.size()>=2){
// if(it->second[0]<ans[0]){
// ans[0]=it->second[0];
// ans[1]=it->second[1];
// }else if(it->second[0]==ans[0]){
// if(it->second[1]<ans[1])
// ans[1]=it->second[1];
// }
//
// }
// }for(auto it:p){//注意!:质因数对应至少有两个数才行 if(it.second.size()>=2){if(it.second[0]<ans[0]){ans[0]=it.second[0];ans[1]=it.second[1];}else if(it.second[0]==ans[0]){if(it.second[1]<ans[1])ans[1]=it.second[1];}}}cout<<ans[0]<<' '<<ans[1];return 0;
}