51nod 1179 最大的最大公约数 (无耻的打表计数法)

来源:互联网 发布:中国的未来在哪里 知乎 编辑:程序博客网 时间:2024/06/09 17:43

题目:
这里写图片描述

考虑清楚就简单了,我们把每个数的因子计数。

两个数的公约数就是计数超过2的数,然后找到最大的那个就好了。

计算每个数的素因子,记得sqrt(),不然会超时。

打表计数法时间复杂度O(n*sqrt(n))。

代码:

#include <iostream>#include <algorithm>#include <map>#include <vector>#include <set>#include <math.h>#include <queue>#include <assert.h>#include <stdio.h>#include <stdlib.h>#include <string>using namespace std;typedef long long ll;#define INF 2147483647int n;int a[1000010]; int main(){    cin >> n;    int key;    int ans = 1;    while(n--){        cin >> key;        int p = sqrt(key);        for(int i = 1;i <= p; i++){            if(key%i == 0){                a[i]++;                a[key/i]++;//                cout << i << endl;            }        }    }    for(int i = 2;i <= 1000000; i++){        if(a[i] >= 2){            ans = i;        }    }    cout << ans << endl;    return 0;}