codeforces 798C - Mike and gcd problem 贪心

本文探讨了一种通过特定操作使序列变得“漂亮”的算法问题。漂亮序列定义为序列中所有元素的最大公约数大于1的序列。文章介绍了如何通过转换序列元素使最大公约数达到2,从而实现序列的“漂亮化”。特别关注了操作次数的最小化,以及如何通过奇偶性判断来高效完成这一过程。

题意:如果一个序列B={b1,b2,b3,…,bn},gcd(b1,b2,b3...bn)>1则称之为漂亮的。

现在给定一个长度为序列和一个操作,选定一个i(0<=i<n),分别用ai-ai+1,ai+ai+1代替原来的ai,ai+1。问最少操作几次,使得序列成为一个漂亮的序列(2<=n<=1e5)

思路:d|(ab) && d|(a+b) -> d|2a && d|2b

所以要将 gcd(ai)=1 转化成 gcd(ai)=2

一对奇数操作一次,即可变为偶数,一奇一偶要两个次。相邻两个都是奇数时,那么优先选择这两个数操作。


#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d",&a[i]);
		}
		int d=__gcd(a[0],a[1]);

		int ans=0;
		for(int i=0;i<n;i++)
		{
			d=__gcd(d,a[i]);
			if((a[i]&1)&&(a[i+1]&1))
			{
				i++;
				ans++;
				continue;
			}
			if(a[i]&1)ans+=2;
		}
		if(d!=1)printf("YES\n0\n");
		else printf("YES\n%d\n",ans);
	}
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值