gcd

题目描述

Alice和Bob在玩数字游戏: 
Alice随机给出n个整数a1、a2、……、an,要求Bob从这些数字中选择一个ai,用[1, 109]之间的任意整数进行替换(替换的数字可能和ai相同),希望替换后n个数的最大公约数尽可能大。 

输入

输入第一行为一个数字n 
第二行包括n个用空格隔开的整数,表示Alice给出的n个数 

输出
输出一个数,表示替换后n个数的最大公约数
样例输入
3
7 6 8
样例输出
2
提示

对于30%的数据,1<=n<=1000 

对于100%的数据,2<=n<=106,1<ai<=109 

首先你会发现暴力过不了,用欧几里得去查找公约数是O(n2)的,用前缀和是O(n log(n))的可以过,BUT我不会打...所以我用了一种玄学的方法,排个序然后去瞎搞判断一个数有几个约数,如果约数个数>=2就不找了:

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[100001];
int ans=0;
int main(){
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    sort(a+1,a+n+1);
    for(int i=a[2];i>=2;i--){
        int ji_lu=0;
        for(int j=1;j<=n;j++){
            if(a[j]%i!=0) ji_lu++;
            if(ji_lu>=2) break;
        }
        if(ji_lu<=1){
            ans=i;
            break;
        }
    }
    cout<<ans;
}
原文地址:https://www.cnblogs.com/dai-jia-ye/p/10848633.html