题目链接:
http://acm.hust.edu.cn/vjudge/contest/70017#problem/V
题目大意:
读入一行数,求出所有数间最大的GCD值
分析:
根据GCD性质,N个数的GCD不大于N−1个数的GCD,所以最大GCD一定出现于两个数间,由于只有至多100个数,100组样例,O(N2)暴力,但是注意读入,一开始用字符串流一直WA,看了题解发现用C语言的字符读入就过了,玄学AC
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| #include <iostream> #include <cstdio> #include <cstdlib> #include <sstream> #include <cstring> #include <string> #include <vector> #include <cmath> #include <set> #define MOD 1000000007 using namespace std; typedef unsigned long long ull; typedef long long ll;
/*---------------------------head files----------------------------------*/
bool num[150000];
void fd() { for (int i = 2 ; i <= 100000 ; i ++) { if (!num[i]) { for (int j = 2*i ; j <= 100000 ; j += i) num[j] = true; } } num[1]=true; num[2]=true; } inline ll max(ll a , ll b) { return a>b? a: b; }
ll gcd (ll a , ll b) { return b==0? a : gcd(b,a%b); } int arr[6666];
int main() { string str; ios::sync_with_stdio(false); ll n,a; char buf; scanf("%d",&n); while (getchar() != '\n'); while (n--) { int cnt=0; ll maxx=0; while ((buf = getchar()) != '\n') if (buf >= '0' && buf <= '9') { ungetc(buf,stdin); scanf("%d",&arr[cnt ++]); } for (int i = 0 ; i < cnt ; i ++) { for (int j = i+1; j <cnt ; j ++) { if (i!=j) maxx = max(maxx, gcd(arr[i],arr[j])); } } cout<<maxx<<endl; } }
|