【ZOJ】4846 GCD Reduce(求n个数的最大公约数)

来源:互联网 发布:网络理财平台排行榜 编辑:程序博客网 时间:2024/06/05 18:36

题目大意:要把一组数最终变为1。每次选择两个数,变成他们的最大公约数。

思路:一组数能够变成都是1的情况,就是这些数的最大公约数是1.

求n个数最大公约数的方法:前n-1个数的最大公约数与第n个数求最大公约数就可以了。

所以这道题目其实就是n个数最大公约数的变形题。

只需要第一遍求出最大公约数1,最后与其他的数求gcd就可以了。

我这边为了方便之前跑两遍也是可以的

#define _CRT_SECURE_NO_WARNINGS#include<iostream>#include<cstdio>#include<cstring>#include<vector>using namespace std;int gcd(int x, int y){return y ? gcd(y, x%y) : x;}int a[100100];int main(){int icase = 1;int n;while (~scanf("%d", &n)){vector<pair<int,int> >s;for (int i = 1; i <=n; i++){scanf("%d", &a[i]);}for (int i = 1; i < n; i++){int c = gcd(a[i], a[i + 1]);s.push_back(make_pair(i, 1 + i));a[i] = c;a[i + 1] = c;}for (int i = n; i > 1; i--){int c = gcd(a[i], a[i - 1]);s.push_back(make_pair(i-1, i));a[i] = c;a[i - 1] = c;}printf("Case %d: ", icase++);if (a[1] == 1){printf("%d\n", s.size());for (int i = 0; i < s.size(); i++)printf("%d %d\n", s[i].first, s[i].second);}elseprintf("-1\n");puts("");}}


0 0