Mike has a sequence A = [a1, a2, ..., an] of length n. He considers the sequence B = [b1, b2, ..., bn] beautiful if the gcd of all its elements is bigger than 1, i.e. .
Mike wants to change his sequence in order to make it beautiful. In one move he can choose an index i (1 ≤ i < n), delete numbers ai, ai + 1 and put numbers ai - ai + 1, ai + ai + 1 in their place instead, in this order. He wants perform as few operations as possible. Find the minimal number of operations to make sequence A beautiful if it's possible, or tell him that it is impossible to do so.
is the biggest non-negative number d such that d divides bi for every i (1 ≤ i ≤ n).
The first line contains a single integer n (2 ≤ n ≤ 100 000) — length of sequence A.
The second line contains n space-separated integers a1, a2, ..., an (1 ≤ ai ≤ 109) — elements of sequence A.
Output on the first line "YES" (without quotes) if it is possible to make sequence A beautiful by performing operations described above, and "NO" (without quotes) otherwise.
If the answer was "YES", output the minimal number of moves needed to make sequence A beautiful.
2 1 1
YES 1
3 6 2 4
YES 0
2 1 3
YES 1
In the first example you can simply make one move to obtain sequence [0, 2] with .
In the second example the gcd of the sequence is already greater than 1.
题意:给出A序列,
ai,ai+1−>ai−ai+1,ai+ai+1
ai,ai+1−>ai−ai+1,ai+ai+1称为一次操作
询问使得序列gcd>1的最少操作次数,不能输出-1
思路: 举个例子, 两个互质并且一奇数一偶数 a, b -> a-b, a+b -> -2b, 2a ->最小公倍数就是2了,所以最后肯定可以变成为gcd = 2的序列, 显然两个奇数就操作一次就都变成偶数了,一奇数一偶数就要两次了;
trick: 之前要扫一遍,判断是不是已经gcd > 1了, 比赛中我过了pp之后,试了一发9 6 炸掉了。。。然后又去改,这题就只有600+分了,,,真是蒟蒻啊。。
另外,如果ai可以为0,n可以为1,全为0, 0 奇数 0都是输出no的
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 5;
ll a[maxn];
int main()
{
int n;
ll sum = 0;
cin >> n;
for(int i = 1; i <= n; i++)
scanf("%lld", &a[i]), sum += a[i];
ll temp = a[1];
for(int i = 2; i <= n; i++)
{
temp = __gcd(a[i], temp);
}
if(temp > 1)
{
cout << "YES" << endl;
cout << 0 << endl;
return 0;
}
if(sum == 0)
{
cout << "NO" << endl;
return 0;
}
for(int i = 2; i <= n; i++)
{
if(a[i]%2 && a[i-1] == 0 && a[i+1] == 0)
{
cout << "NO" << endl;
return 0;
}
}
ll ans = 0;
a[n+1] = 0;
for(int i = 1; i <= n; i++)
{
if(a[i]%2 && a[i+1]%2)
{
ans++;
i++;
}
else if(a[i]%2 && a[i+1]%2 == 0)
{
if(i == n)
{
ans += 2;
}
else
{
ans += 2;
i++;
}
}
}
cout << "YES" << endl;
cout << ans << endl;
return 0;
}