GCD Reduce

Description

You are given a sequence {A1A2, ..., AN}. You task is to change all the element of the sequence to 1 with the following operations (you may need to apply it multiple times):

  • choose two indexes i and j (1 ≤ i < j ≤ N);
  • change both Ai and Aj to gcd(AiAj), where gcd(AiAj)
    is the greatest common divisor of Ai and Aj.

You do not need to minimize the number of used operations. However, you need to make sure that there are at most 5N operations.

Input

Input will consist of multiple test cases.

The first line of each case contains one integer N (1 ≤ N ≤ 105), indicating the length of the sequence. The second line contains Nintegers, A1A2, ..., AN (1
≤ Ai ≤ 109).

Output

For each test case, print a line containing the test case number (beginning with 1) followed by one integer M, indicating the number of operations needed. You must assure that M is no larger than 5N. If you cannot find a
solution, make M equal to -1 and ignore the following output.

In the next M lines, each contains two integers i and j (1 ≤ i < j ≤ N), indicating an operation, separated by one space.

If there are multiple answers, you can print any of them.

Remember to print a blank line after each case. But extra spaces and blank lines are not allowed.

Sample Input

4
2 2 3 4
4
2 2 2 2

Sample Output

Case 1: 3
1 3
1 2
1 4

Case 2: -1

题意:给出n个数,试着求出这n个数最后的最大公约数是否为1;若果为1,那么给出两两匹配的顺序(次数不能超出5*n);反之,输出-1;

我们先判断n个数的最大公约数是否为1.即一个数与其他所有数求公约数;看最后是否是1.若果为1那么最后输出的时候。输出两遍即可;输出的次数为2*n-2;输出格式不唯一;

标程:

# include <iostream>
# include <cstdio>
using namespace std;

const int maxn = 1e5 + 10;

int a[maxn];

int gcd(int a,int b)
{
    if(b)   return gcd(b,a%b);  //如果b不为0;
    return a;
}

int main()
{
    int kase=0,n;
    while(~scanf("%d",&n)){
        for(int i = 0; i < n;i++)   scanf("%d",&a[i]);
        int temp = a[0];
        for(int i = 1;i < n;i++)    temp = gcd(temp,a[i]);  //找出所有数的最大公约数;
        printf("Case %d: ",++kase);
        if(temp != 1){
            puts("-1");
            puts("");
        }
        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;
}
时间: 2024-10-21 17:19:59

GCD Reduce的相关文章

ZOJ 3846 GCD Reduce//水啊水啊水啊水

GCD Reduce Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge You are given a sequence {A1, A2, ..., AN}. You task is to change all the element of the sequence to 1 with the following operations (you may need to apply it multiple ti

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> #in

HackerRank - &quot;Sherlock and GCD&quot;

This is a very smart observation:http://www.martinkysel.com/hackerrank-sherlock-and-gcd-solution/ # http://www.martinkysel.com/hackerrank-sherlock-and-gcd-solution/ # from functools import reduce def gcd(a, b): if a == 1 or b == 1: return 1 if a % b

Sherlock and GCD

1 import fractions, functools, sys 2 3 4 if __name__ == '__main__': 5 T = int(sys.stdin.readline()) 6 7 for _ in range(T): 8 N = int(sys.stdin.readline()) 9 A = list(map(int, sys.stdin.readline().split())) 10 11 gcd = functools.reduce(fractions.gcd,

python的reduce()函数

reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值.(也就是最后一次是返回值) #reduce()函数 from functools import reduce def f(x,y): return x+y print(reduce(f, [1, 3, 5, 7, 9])) # 先计算头两个元素:f(1, 3),结果为4: # 再把结果和第3个元素计算:f(4, 5),结果为9: # 再把结果和第4个元素计算:f(9, 7),结

dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)

1094: 等差区间 Time Limit:5000/3000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Total Submissions:655   Accepted:54 [Submit][Status][Discuss] Description 已知一个长度为 n 的数组 a[1],a[2],-,a[n],我们进行 q 次询问,每次询问区间 a[l],a[l+1],-,a[r?1],a[r] ,数字从小到大

iOS GCD中级篇 - dispatch_group的理解及使用

前文我们讲了GCD基础篇,以及同步.异步,并发.并行几个概率的理解. 参考链接: iOS GCD基础篇 - 同步.异步,并发.并行的理解 现在讲一下dispatch_group的概念以及几种场景下的使用 1.关于dispatch_group 把一组任务提交到队列中,这些队列可以不相关,然后监听这组任务完成的事件. 最常见的几个方法: 1.dispatch_group_create创建一个调度任务组 2.dispatch_group_async 把一个任务异步提交到任务组里 3.dispatch_

转 GCD

GCD 深入理解:第一部分 本文翻译自 http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 原作者:Derek Selander 译者:@nixzhu 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD . 在这两

GCD多线程死锁总结

// //  ViewController.m //  多线程 // // #import "ViewController.h" @interface ViewController () @end @implementation ViewController /* >1 队列和线程的区别: 队列:是管理线程的,相当于线程池,能管理线程什么时候执行. 队列分为串行队列和并行队列 串行队列:队列中的线程按顺序执行(不会同时执行) 并行队列:队列中的线程会并发执行,可能会有一个疑问,队