首页 > 代码库 > ZOJ 4846 GCD Reduce (数学分析题)
ZOJ 4846 GCD Reduce (数学分析题)
题目链接 :
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5440
题意:
给定一个长度为n的数列每次可以选个二元组(a[i],a[j])换成他们的最大公约数
然后问能不能再5*n次操作内把他们全部换成1,
分析:
因为每次操作都是换成GCD 因此n数的GCD肯定为1,如果不为1的话肯定不能变成1的
然后随便构造一种方法就行了,从1到n搞两遍 一定可以全变成1;
代码如下:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn = 1e5+10; int a[maxn]; int gcd(int a,int b) { if(b) return gcd(b,a%b); return a; } int main() { int cas=1,n; while(~scanf("%d",&n)){ int mmin = 1999999999,num=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); if(a[i]<mmin) mmin = a[i]; } int tmp=a[0]; for(int i=1;i<n;i++) tmp=gcd(tmp,a[i]); printf("Case %d: ",cas++); if(tmp!=1){ puts("-1"); puts(""); continue; } else{ printf("%d\n",2*n-2); for(int i=1;i<n;i++) printf("1 %d\n",i+1); for(int i=1;i<n;i++) printf("1 %d\n",i+1); puts(""); } } return 0; }
ZOJ 4846 GCD Reduce (数学分析题)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。