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 }

 

posted @ 2019-04-29 09:29  flymoon  阅读(231)  评论(0编辑  收藏  举报