1. 程式人生 > 實用技巧 >最大公約數(Max Gcd)

最大公約數(Max Gcd)

最大公約數

今天是國慶節, 小\(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;
}

液,做完了