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

GCD Reduce


Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge


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 N integers, 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个数,每次任意选取两个数,然后这两个数的值会变成gcd(a,b),如果能把整个序列都变成1的话,求选择的顺序;

思路:很明显只要做出1就行了,gcd(1,x)=1,我从第一个数开始一直向后面去gcd,取到第i个数肯定就是那么1的值前i个数的gcd,只要判断一直取到最后一个第1个数有没有变成1就行了,判断有之后,说明除了第一个数其他的n-1个数肯定会是有一个数跟第一个数的gcd为1,反证法就能很好的证明,那么只要第一个数跟另外的n-1个数依次取gcd,碰到互质就跳出来,并记录点,那么只要先选择1和这个点,剩下的n-2个数直接和1取就行了,但是这样交上去时wa的。。。你第一个数依次和后面的数取gcd那么取到最后一个的时候,1这个数肯定是前n个数的最大公约数,如果第一个数此时为1的话,那么再进行一次操作就好了,要求操作次数小于5*n,这个时候只是2*(n-1),完全是可以的,这样交上去是对的,反过来想,第一个数取到最后为1,那么最后一个数肯定这个时候也为1啊,我从后面往前GCD肯定也是对的,但是这样写的话交上去也是wa的,应该是special judge没有写好。。。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 using namespace std;
 5 #define N 100100
 6 int a[N];
 7 int gcd(int a,int b)
 8 {
 9     if(b==0) return a;
10     return gcd(b,a%b);
11 }
12 int main()
13 {
14     int n;
15     int cnt=0;
16     while(scanf("%d",&n)!=EOF)
17     {
18         cnt++;
19         for(int i=1;i<=n;i++)
20             scanf("%d",&a[i]);
21         int res=a[1];
22         for(int i=2;i<=n;i++)
23             res=gcd(res,a[i]);
24         if(res!=1)
25             printf("Case %d: -1\n\n",cnt);
26         else
27         {
28             printf("Case %d: %d\n",cnt,2*(n-1));
29             for(int i=2;i<=n;i++)
30                 printf("1 %d\n",i);
31             for(int i=2;i<=n;i++)
32                 printf("1 %d\n",i);
33                 printf("\n");
34         }
35     }
36     return 0;
37 }

时间: 2024-08-03 23:37:34

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

5S进水不开机了修好多少钱iPhone5S进水维修多少钱5S进水不开机维修

为什么网上的价格差距这么大?为什么打电话问的商家报的价格都不一样?哪种几百块钱的屏幕(芯片)能相信吗?淘宝上面的屏幕(芯片)能相信吗?哪里能找到原装的屏幕呢?哪里的维修点才靠谱呢?北京中关村和深圳那边的维修市场能相信吗? 电子城报的二三百能相信吗?原装的配件和仿的价钱相差多少呢? 当您看到了这里,请您选择飞维智能科技有限责任公司(我们用最真挚的态度来为您服务) 我们在保证质量的前提下用最低的价格来为广大客户服务.我们的原则是(少花钱,买放心,保质量,求口碑) 工程师:罗飞报修热线:158 110

iphone5S进水维修多少钱5S进水主板短路返厂维修多少钱(推荐维修)

为什么网上的价格差距这么大?为什么打电话问的商家报的价格都不一样?哪种几百块钱的屏幕(芯片)能相信吗?淘宝上面的屏幕(芯片)能相信吗?哪里能找到原装的屏幕呢?哪里的维修点才靠谱呢?北京中关村和深圳那边的维修市场能相信吗? 电子城报的二三百能相信吗?原装的配件和仿的价钱相差多少呢? 当您看到了这里,请您选择飞维智能科技有限责任公司(我们用最真挚的态度来为您服务) 我们在保证质量的前提下用最低的价格来为广大客户服务.我们的原则是(少花钱,买放心,保质量,求口碑) 工程师:罗飞报修热线:158 110

Java的深拷贝最新版欣欣十三水棋牌_房卡十三水全套棋牌源码下载和浅拷贝

关于最新版本的Java新版13水棋棋牌室13水全套棋牌源码下载超级MAN.,只是为了创建与已知对象相同的对象.在日常编码中,它可能用得不多,但这是面试官经常问的问题,理解深拷贝和浅拷贝的原理将导致对什么是更深入的理解调用Java中的值传递或引用传递.    回到顶峰    创建对象的1, 5种方法.        通过新关键词        这是通过用新的关键字调用类的参数化或非参数构造函数来创建对象的最常见的方法.例如,对象Obj=新对象():        (2)传递类类的NeWistSis

ACM学习历程—ZOJ 3868 GCD Expectation(莫比乌斯 || 容斥原理)

Description Edward has a set of n integers {a1, a2,...,an}. He randomly picks a nonempty subset {x1, x2,…,xm} (each nonempty subset has equal probability to be picked), and would like to know the expectation of [gcd(x1, x2,…,xm)]k. Note that gcd(x1, 

zoj.3868.GCD Expectation(数学推导&gt;&gt;容斥原理)

GCD Expectation Time Limit: 4 Seconds                                     Memory Limit: 262144 KB Edward has a set of n integers {a1, a2,...,an}. He randomly picks a nonempty subset {x1, x2,…,xm} (each nonempty subset has equal probability to be pick

GCD Reduce

Description 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 times): choose two indexes i and j (1 ≤ i < j ≤ N); change both Ai and

Zoj 3868 GCD Expectation

给一个集合,大小为n , 求所有子集的gcd 的期望和 . 期望的定义为 这个子集的最大公约数的K次方 : 每个元素被选中的概率是等可能的 即概率 p = (发生的事件数)/(总的事件数); 总的事件数 = 2^n -1; 大小为n的集合的非空子集个数为2^n -1 期望 = p(i) *i; = 1*p(1) + 2*p(2) + ... +n*p(n); 设x发生的事件数为 dp[x] , 则上式可化简为: =1*dp[1]/(2^n-1) + 2*dp[2]/(2^n-1) + ... +

[暴力统计] zoj 3868 GCD Expectation

题意: 给n和k,求n个数的任意非空子集gcd的k次方的期望. 最后期望乘上2^n-1 思路: 因为取每个子集都是等概率,所以取出每个子集的概率是1/(2^n-1) 然而最后的答案是乘上2^n-1 所以其实求的就是每个非空子集的gcd的k次方的和. 然后就是求法了. 我们可以把题目转换成求gcd等于i的非空集合有多少个. gcd从Max枚举到1,求出答案. 对于每个i,设n个数中是i的倍数的数有x个. 那么gcd等于i的个数就是总共的 (2^x-1)个减去gcd等于j的个数,j是i的倍数. 因此