数论(lcm)

CodeForces - 1154G

题意:求最小的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 ;
}

 

posted @ 2019-11-08 16:14  无名菜鸟1  阅读(623)  评论(0编辑  收藏  举报