您的位置:首页 > 其它

Codeforces 798C Mike and gcd problem gcd+贪心

2017-04-22 19:34 387 查看
点击打开链接

题意:n个数,n<=1e5,操作:把ai,ai+1 替换成 a[i]-a[i+1],a[i]+a[i+1],问gcd(a1,a2..an)>1的最少操作次数 

若初始d=gcd(a1..an)==1,肯定使用操作,则使用操作后->d|2a[i] d|2a[i+1],可以看出最后的d一定整除偶数,所以n个数必须都为偶数. 

问题转化为把n个数变为偶数的最小操作次数 a[i]-a[i+1],a[i]+a[i+1],相邻两个odd需要一次操作,相邻odd,even 需要两次操作

贪心:先处理(odd,odd) 在处理(o,e),(e,o)即可  

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+20;
ll a
,n;
ll gcd(ll a,ll b)
{
return b==0?a:gcd(b,a%b);
}
int main()
{
while(cin>>n)
{
for(int i=1;i<=n;i++)
scanf("%I64d",&a[i]);
ll d=gcd(a[1],a[2]);
for(int i=3;i<=n;i++)
d=gcd(d,a[i]);
if(d>1)
{
puts("YES");
puts("0");
continue;
}

int ans=0;
for(int i=1;i<n;i++)
{
if(a[i]%2&&a[i+1]%2)
a[i]=0,a[i+1]=0,ans++;//变为任意偶数即可
}
for(int i=1;i<n;i++)
{
if(a[i]%2&&a[i+1]%2==0||(a[i]%2==0&&a[i+1]%2))
a[i]=0,a[i+1]=0,ans+=2;
}
puts("YES");
cout<<ans<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: