题干:

You have an array a with length n, you can perform operations. Each operation is like this: choose two adjacent elements from a, say x and y, and replace one of them with gcd(x, y), where gcd denotes the greatest common divisor.

What is the minimum number of operations you need to make all of the elements equal to 1?

Input

The first line of the input contains one integer n (1 ≤ n ≤ 2000) — the number of elements in the array.

The second line contains n space separated integers a1, a2, ..., an (1 ≤ ai ≤ 109) — the elements of the array.

Output

Print -1, if it is impossible to turn all numbers to 1. Otherwise, print the minimum number of operations needed to make all numbers equal to 1.

Examples

Input

5
2 2 3 4 6

Output

5

Input

4
2 4 6 8

Output

-1

Input

3
2 6 9

Output

4

Note

In the first sample you can turn all numbers to 1 using the following 5 moves:

  • [2, 2, 3, 4, 6].
  • [2, 1, 3, 4, 6]
  • [2, 1, 3, 1, 6]
  • [2, 1, 1, 1, 6]
  • [1, 1, 1, 1, 6]
  • [1, 1, 1, 1, 1]

We can prove that in this case it is not possible to make all numbers one using less than 5 moves.

题目大意:

给你一组数,定义一个操作:每次可以选择相邻的两个并且把其中一个的值变成他俩的gcd,,求问多少次操作后可以把这组数变成全1的、

给你一个长度为n的数组a。每次操作你可以选择相邻的两个位置a[i],a[i+1],将其中某一个数用gcd(a[i],a[i+1])来代替。
你的目标是最后将a中所有元素都变成1,问最少需要多少次操作。如果无论怎样最后a数组不能全变成1,那么输出-1

解题报告:

看数据量,o(n^2)暴力就好了。。首先凑出一个1,然后剩下的次数就是剩下不是1的个数了。。

这样构造的正确性想想就出来了。。其实也不难想,,因为你每次操作最多就改变一个数嘛、、假设就算这些数全是互质的,那也就是相当于先挑任意俩个来凑出个1,然后再去更新其他值嘛,,所以和直接看1的个数是一样的,,所以这题的关键点在于找1,而不是找互质的两个数。

贴一个题解:当序列中有1时,则gcd(1,s[i])最优。如果没有1,要凑出一个1. 
gcd(gcd(a,b),gcd(b,c))=gcd(gcd(a,b),c)=gcd(a,gcd(b,c))

AC代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<queue>
#include<map>
#include<vector>
#include<set>
#include<string>
#include<cmath>
#include<cstring>
#define ll long long
#define pb push_back
#define pm make_pair
#define fi first
#define se second
using namespace std;
const int MAX = 2e5 + 5;
const int INF = 0x3f3f3f3f;
int a[MAX];
int main()
{int t,cnt=0,n;int minn = INF;cin>>n;for(int i = 1; i<=n; i++) {scanf("%d",a+i);if(a[i] == 1) cnt++;}if(cnt!=0) {printf("%d\n",n-cnt);return 0 ;}int g;for(int i = 1; i<n; i++) {g=a[i];for(int j = i+1; j<=n; j++) {g=__gcd(g,a[j]);if(g==1) {minn = min(minn,j-i+n-1);//相当于先凑出这个1用了j-i,然后相当于cnt=1的上面那种情况,用n-cnt步来凑出答案。break;}}}if(minn == INF) puts("-1");else printf("%d\n",minn);return 0 ;}

【CodeForces - 892C 】Pride (数学,思维构造,gcd)相关推荐

  1. CodeForces - 1291D Irreducible Anagrams(思维+构造)

    题目链接:点击查看 题目大意:首先规定两个字符串 s 和 t 为 Anagrams ,当且仅当字符串 t 可以通过字母重新排列后得到 s ,也就是每个字符出现的次数相同,但位置不做要求,紧接着规定另一 ...

  2. CodeForces - 125C Hobbits' Party(思维+构造)

    题目链接:点击查看 题目大意:有一个派对,现在有 n 个人参加,题目要求我们构造出一种参加方式,满足条件且可以维持的天数最大: 任意两天中至少有一个相同的人参加 任意三天中不能有一个相同的人参加 输出 ...

  3. CodeForces - 1270C Make Good(思维+构造)

    题目链接:点击查看 题目大意:给出一个由n个数字构成的数列,现在已知其累加和为sum,异或和为xor,现在允许我们向数列中添加0~3个数,以满足sum=2*xor,构造出任意一种方案 题目分析:一开始 ...

  4. CodeForces - 1270D Strange Device(思维+构造)

    题目链接:点击查看 题目大意:规定一个含有n个元素的数组a,每个元素互不相等,但是全部未知,现在给出一台机器,这台机器有两个参数,分别是k和m,其意义是每次可以询问k个下标,机器将给出k个下标中第m大 ...

  5. swing打地鼠游戏_在家也能玩的幼儿数学思维小游戏(2)多种数数的方法

    相信不少关注幼儿数学思维学习的家长朋友们都知道,孩子数数有几个阶段和过程,最开始的时候是唱数,然后过渡过用手指点数,能按物取数.按数取数,理解数的实际意义,最后到认识数字.这是孩子正常的数数阶段.在掌 ...

  6. 扑克牌排序_巧用扑克牌搞定孩子的数学思维启蒙,聪明的妈妈都在玩这样的游戏...

    很多家长谈到数学思维启蒙,都一个头两个大,不知道怎么去做.客观来说,数学思维启蒙说难也难,说简单也简单,本文是数萌在线的老师把数学思维课上常玩的数学思维游戏与扑克牌游戏结合,对提升孩子思维能力的效果非 ...

  7. 找出所有层级_数轴上的行程问题1:你的数学思维水平在哪一个层级?

    前言:对于很多学生来说,从小学六年级到初中一年级,数学学习仿佛一下子迷失了方向,相当长时间找不到切入点,无法适应初中数学的学习.究其根本原因,是思考问题的方式出了问题,小学熟知的算术思维迟迟不能跨越. ...

  8. 中国人数学好,数学思维差?

    小天经常可以看到在微博热搜吐槽歪果仁数学不好的段子,比如6.8,我们习惯给11.8,让收银员找5块钱,但歪果仁就不行啦,这样他们会更乱! 所以我们容易觉得中国人数学好,算数特别快还准!但算术,只能说是 ...

  9. 数学思维比数学运算更重要

    全世界只有3.14 % 的人关注了 数据与算法之美 数学的证明依靠严密的逻辑推理,一经证明就永远正确,所以,数学证明是绝对的. 相对而言,科学的证明则依赖于观察.实验数据和理解力,科学理论的证明难以达 ...

  10. 计算机思维与数学思维的本质区别

    计算机思维和数学思维,都包括了抽象和逻辑. 数学的抽象,在于剥离具体.数学研究从公理出发,可以变成纯思维的活动,和具体的的现实脱离关系.数学上的人为"定义",就是为了尽可能给出范围 ...

最新文章

  1. Python基础最常用且重要的模块总结----建议收藏
  2. JavaScript强化教程-JS面向对象编程
  3. python如何计算个人gpa_使用While循环(Python)计算GPA
  4. CAN总线技术 | 数据链路层02 - 帧结构
  5. 求某一维度的最大值_高中数学函数求最值常用方法总结
  6. C#WinCE程序(.NET Compact Framework 3.5)项目重构面向抽象设计
  7. KB-QA:如何对问题进行信息抽取?
  8. JWT-JSON WEB TOKEN使用详解及注意事项
  9. Oracle启动报错ORA-03113解决
  10. 论文阅读-Face X-ray for More General Face Forgery Detection
  11. 重要消息|2020年9月1日起, SSL证书最长有效期变更为1年
  12. 实验一 java基础编程(预习报告)
  13. Angel-Eye: A Complete Design Flow for MappingCNN onto Embedded FPGA
  14. 暗黑破坏神游戏服务器为空,分享暗黑破坏神3各种错误代码的解决办法
  15. VB编程操作AutoCAD单行文字
  16. 异性交往,高情商的女人,常用这3种方法抓住男人的心
  17. 霍金带你逃离时间的黑洞
  18. android studio 使用svn版本控制完全解析
  19. minecraft(我的世界) 外网远程联机【免费内网穿透】
  20. 8.3 Python图像处理之图像典型分割-分水岭分割

热门文章

  1. [Leetcode][第1143题][JAVA][最长公共子序列][LCS][动态规划]
  2. [剑指offer][JAVA]面试题第[21]题[调整数组顺序使奇数位于偶数面前][双指针]
  3. hihocoder A Game 区间dp
  4. 废粉盒在哪里_很想知道打印机废粉盒中的那些废碳粉应该怎么处理?
  5. PHP用gd库给图片添加水印,php用GD库给图片添加水印
  6. java创建对象过七夕,想 new 个对象过七夕,她却抛了异常
  7. 计算机找不到管理无线网络,电脑wifi密码忘了 并且找不到管理无线网络该怎么处理?...
  8. linux隐藏apache信息,Linux下如何隐藏Apache版本号信息
  9. linux下c 编译脚本,Linux下编译C语言与makefile脚本语言
  10. excel条形码字体_在Excel中批量生成条形码,竟如此简单!