您的位置:首页 > 其它

CF --- 798 C Mike and gcd problem 【思维】

2017-08-18 18:45 330 查看
传送门

//题意给定一个序列, 问最少操作几次可以使这个序列的GCD大于1. 每次操作是指选取一个数a[i], 删去a[i]和a[i+1]. 并替换成a[i] - a[i-1], a[i] + a[i+1].

//思路: 首先分析是可以知道的一定会输出YES, 因为当全部都是偶数时就一定可以啊, a[i] - a[i-1], a[i] + a[i+1]这个操作一定是可以将奇数变成偶数的, 最多进行两次, 所以当全部都变成偶数时也就是我们所需要的序列了. 所以直接模拟做就行了, 最后记得判一下最后那个数是不是奇数. 是的话答案要加2. (不懂的话仔细看看代码理解理解就行了)

AC Code

/** @Cain*/
const int maxn=1e5+5;
int a[maxn];
void solve()
{
int n;
while(~scanf("%d",&n)){
int g;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(i == 1) g = a[i];
else g = __gcd(g,a[i]);
}
if(g > 1 ){
printf("YES\n0\n");
continue;
}  //此时序列的总GCD一定是1.
int res = 0;
for(int i=1;i<n;i++){
while(a[i] & 1){
res++;
int x = a[i]-a[i+1];
int y = a[i]+a[i+1];
a[i] = x; a[i+1] = y;
}  //全部变成偶数.
}
if(a
& 1) res += 2;  //特判最后一个数
puts("YES");
printf("%d\n",res);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: