【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
- 【ZOJ】4846 GCD Reduce(求n个数的最大公约数)
- 求两个或N个数的最大公约数(gcd)和…
- 求N个数的最大公约数
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)的较优算法
- 求两个或N个数的最大公约数(gcd)和最小公倍数(lcm)
- 求n个数的最小公倍数与最大公约数
- 求最大公约数(GCD)
- 求最大公约数(gcd)
- n个数的最大公约数
- 求两个正整数的最大公约数(GCD)
- 求两个自然数的最大公约数(GCD)?
- 求两个或N个数的最大公约数和最小公倍数
- 求两个数或者N个数的最大公约数和最小公倍数
- hibernate缓存机制详细分析
- 建立一个Stack类,有min功能
- Android学习
- 31、签名解释 & eclipse实现签名过程
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds
- 【ZOJ】4846 GCD Reduce(求n个数的最大公约数)
- libevent代码阅读
- 方法重载与构造方法重载
- Mac系统下使用genymotion模拟器的一些问题
- 关于sizeof的问题(3)
- stl源码剖析 详细学习笔记 RB_tree (2)
- 谱聚类基础-原理和细节(1):用图划分思想解释谱聚类
- HTTP/1.1与HTTP/1.0的区别
- servlet中web.xml配置详解