type
status
date
slug
summary
tags
category
icon
password
题目链接:
题目描述
迈克有一个长度为的序列 。如果序列 中所有元素的gcd都大于 1 ,他就认为这个序列 很美,即。
Mike 想改变他的序列,使其更加美观。他可以选择一个索引 ,删除数字 ,并按照这个顺序将数字 放到它们的位置上。他希望进行尽可能少的运算。如果可能,请找出使数列 变美的最少运算次数,或者告诉他不可能这样做。是最大的非负数 ,使得 除于 为 。
输入描述
第一行包含一个整数 - 序列 的长度。
第二行包含 个空格分隔的整数 - 序列 A 的元素。
输出描述
如果可以通过执行上述操作使序列 变美,则在第一行输出"YES"(不带引号),否则输出"NO"(不带引号)。
如果答案是"YES",则输出使序列 优美所需的最小步数
示例
输入1
输出1
输入2
输出2
输入3
输出3
说明
在第一个示例中,你只需移动一次,就可以得到序列 [0, 2] ,其中有 。
在第二个示例中,序列中的 已经大于 。
题解
这是一道思维题,不管数据怎么样,输出结果都是“YES”。如果 ,直接输出0,否则 。
先来解释一下为什么输出肯定是“YES”:
- 对于两相邻的数 ,如果要进行操作,操作一次后变为 a-b,a+b,在操作一次变成 -2b,2a,也就是说,只要操作足够多的次数,最后这个数列 一定可以到达2,也就是输出“YES“。
下面来证明为什么要操作的话最终的 一定是2:
- 将 和 变成 和 ,若操作前其 为 ,那么操作后其 只可能为 或 ,不会再增加其他质因子。
证明:设x=gcd(a_i, a_{i+1}),ai = ax, a_{i+1} = bx
操作后a_i=(a-b)x, a_{i+1} =(a+b)x
则 gcd(a_i, a_{i+1})= gcd((a-b)x, (a+b)x)=x*gcd(a -b, a+b)
设gcd(a-b, a+b)=k, a-b=a’k, a+b=b’k
那么(a-b)+(a+b)=a'k+b’k, (a+b)-(a-b)=b’k-a’k
所以 2a =a'k+b'k, 2b=b’k-a’k
因为 gcd(2a, 2b)=2×gcd(a, b)=2
所以gcd(a'k + b’k, b’k-a’k)=k* gcd(a’ +b’, b’ -a’)=2
可得k=1或k=2
故gcd(a_i, a_{i+1})=x*k=x或2x
下面给出完整代码:
(这次代码写的比较垃圾,建议根据前面的思维证明自己写。)
- Author:Serendipity
- URL:https://serendipity565.netlify.app//article/Mike%20and%20gcd%20problem
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!