传送门
//题意给定一个序列, 问最少操作几次可以使这个序列的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;iwhile(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[n] & 1) res += 2; //特判最后一个数
puts("YES");
printf("%d\n",res);
}
}