最大公約數(Max Gcd)
阿新 • • 發佈:2020-07-20
最大公約數
今天是國慶節, 小\(Z\)為了給祖國慶祝生日拿來了\(n\)個數字:\(a_1,a_2…a_n\)。
求 \(max\){\(gcd(a_i,a_j)\)} \(( i!=j )\)Input
第一行一個整數 \(n\)。
之後一行 \(n\) 個數, 表示 \(a_1,a_2…a_n\)。Output
輸出一個整數表示答案。
Example
輸入 #1
\(3\)
\(4\) \(3\) \(6\)輸出 #1
\(3\)
Scoring
對於 30%的資料, 滿足 \(n≤1000\);
對於 100%的資料, 滿足 \(n≤10000\), \(1≤a_i≤10^6\);
並不是難題...但是為了紀念一下暑期集訓第一道一遍AC的題(其實是想摸魚
所以就來寫題解了
看完題面:哦哦哦我會了我可以拿三十分快去下一題(bus
然後努力想了想,輾轉相除法咋寫來著
三十分暴力程式碼——
#include<bits/stdc++.h> using namespace std; int n; int a[10005], ans = 1; int gcd(int a, int b) { if(b==0)return a; return gcd(b, a%b); } int main() { scanf("%d", &n); for (int i = 1; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i < n; i++) for(int j = i + 1; j <= n; j++) ans = max(ans, gcd(a[i], a[j])); printf("%d", ans); return 0; }
然後敲完二三兩題的暴力又回來想了想
對於 100%的資料, 滿足 \(n≤10000\), \(1≤a_i≤10^6\);
\(1≤a_i≤10^6\);
要素察覺
然後一通腦內瞎搞把正解寫出來了
詳細做法見程式碼註釋
//:D #include<bits/stdc++.h> using namespace std; int n, maxn = 1; int a[10005], f[100005];//f[i]=p 表示在這n個數中,p個數的約數中有i int main() { //freopen("gcd.in", "r", stdin); //freopen("gcd.out", "w", stdout); scanf("%d", &n); for (int i = 1; i <= n; i++){ scanf("%d",&a[i]); maxn = max(maxn, a[i]); for (int j = 1; j * j <= a[i]; j++) if (a[i] % j == 0){ if(j * j != a[i])f[j]++, f[a[i] / j]++;//統計—— else f[j]++; } } for (int i = maxn; i >= 1; i--) if (f[i] >= 2){//從大到小列舉到第一個是多個數因數的數(好繞 printf("%d", i); return 0; } return 0; }
液,做完了