数论(lcm)
题意:求最小的lcm(a,b)的下标;
#include <bits/stdc++.h> #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <iostream> #include <cstdio> #include <string> #include <stdio.h> #include <queue> #include <stack> #include <map> #include <set> #include <string.h> #include <vector> #define ME(x , y) memset(x , y , sizeof(x)) #define SF(n) scanf("%d" , &n) #define rep(i , n) for(int i = 0 ; i < n ; i ++) #define INF 0x3f3f3f3f3f3f3f3fLL #define mod 1000000007 #define PI acos(-1) using namespace std; typedef long long ll ; const int N = 1e7 + 5 ; int p[N] , n; int main() { int x , flaga , flagb ;//值,左下标,右下标 ll minv ;//最小lcm值 while(~scanf("%d" , &n)) { memset(p , 0 , sizeof(p));//标记数组 minv = INF ; for(int i = 1 ; i <= n ; i++) { scanf("%d" , &x); if(p[x] && x < minv)//出现了两次且小于原lcm,更新 { minv = x ; flaga = p[x]; flagb = i ; } p[x] = i ;//标记该数出现 } for(int i = 1 ; i < N && i < minv ; i++)//遍历1-1e7+5数 { ll v = 0 ; int pos ; for(int j = i ; j < N && j < minv ; j+=i)//成倍数的遍历。 { if(p[j])//该数出现 { if(v==0)//第一个数 { v = j ; pos = p[j]; } else if(v / i * j < minv)//第二个数出现,且小于原lcm更新。 { minv = v / i * j ; flaga = pos ; flagb = p[j]; } else { break ; } } } } if(flaga > flagb) swap(flaga , flagb); cout << flaga << " " << flagb << endl; } return 0 ; }