GCD on Blackboard
题目大意:给你n个数,然后在这n个数中选一个数,选中的这个数可以变成任意的数,使这n个数的gcd(最大公约数)最大。打印这个最大的gcd。
思路:这题一看貌似很复杂,其实这题只要你知道前缀和 和 后缀和的概念,这题就变得非常简单,用前缀和求出前几个的gcd,后缀和求出后几个的gcd,然后再利用前缀和 和 后缀和求出这个最大的gcd 中间空一个数,即可得到答案。注意:你还要看选中的这个数是第一个还是最后一个,需要比较这个这个的gcd 谁大,就是忘了导致wa了几发。
下面是我写的代码,不喜勿喷。
1 #include <iostream> 2 #include <cstdio> 3 #include <cmath> 4 #include <queue> 5 #include <map> 6 #include <cstring> 7 #include <string> 8 #include <set> 9 #include <vector> 10 #include <list> 11 #include <deque> 12 #include <algorithm> 13 #include <stack> 14 #include <numeric> 15 #include <time.h> 16 #include<iomanip> 17 #include<sstream> 18 #pragma disable:4996) 19 using namespace std; 20 const long long inf = 0x7f7f7f7f; 21 long long GCD(long long a, long long b) { return 0 == b ? a : GCD(b, a%b); } 22 const long long mod = 1e9 + 7; 23 const double pi = acos(-1); 24 long long a[120000]; 25 long long l[120000]; 26 long long r[120000]; 27 int main() 28 { 29 ios_base::sync_with_stdio(false); 30 int n; 31 cin >> n; 32 for (int i = 0; i < n; i++) 33 cin >> a[i]; 34 l[0] = a[0]; 35 for (int i = 1; i < n; i++) 36 l[i] = GCD(l[i - 1], a[i]); 37 r[n - 1] = a[n - 1]; 38 for (int i = n - 2; i >= 0; i--) 39 r[i] = GCD(r[i + 1], a[i]); 40 long long ans = 1; 41 for (int i = 1; i < n-1; i++) 42 ans = max(GCD(l[i - 1], r[i + 1]), ans); 43 cout << max(ans,max(r[1],l[n-2])) << endl; 44 }