789C Mike and gcd problem
2017-04-24 13:47
281 查看
C. Mike and gcd problem
time limit per test:2 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output
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. .
![](http://codeforces.com/predownloaded/95/64/9564b5d5792d464213a733bc62e19d424d991193.png)
.
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.
![](http://codeforces.com/predownloaded/ee/ed/eeed959e241062c1b7376e31c0fb68ca0c4afd9e.png)
is the biggest non-negative number d such that d divides bi for every i (1 ≤ i ≤ n).
Input
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
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.
Examples
Input
2
1 1
Output
YES
1
Input
3
6 2 4
Output
YES
0
Input
2
1 3
Output
YES
1
对于任意两个相邻的数进行操作的最终结果都会使他们都变为偶数,因此如果需要进行操作的话,最终目的都是使所有数都变为偶数。
如果相邻两个数位一奇一偶需要操作两次,两奇则需要操作一次这样的话只要On模拟一遍就能得出答案。如果一开始就符合条件直接输出0即可。
因此这一题没有NO的情况。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm = 100005;
int a[maxm], b[maxm];
int gcd(int x, int y);
int main()
{
int n, i, j, k, sum, ans;
scanf("%d", &n);
for (i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b + 1, b + 1 + n);
if (b
== 0)
ans = 5;
else
{
ans = b
;
for (i = n - 1;i >= 1;i--)
{
if (b[i] == 0)
continue;
ans = gcd(ans, b[i]);
}
}
if (ans > 1)
{
printf("YES\n0\n");
return 0;
}
ans = 0;
for (i = 1;i < n;i++)
{
if (a[i] % 2 == 0)
continue;
if (a[i + 1] % 2 != 0)
{
ans++;
a[i + 1] = 2;
}
else
{
ans += 2;
a[i + 1] = 2;
}
}
if (a
% 2 != 0)
ans += 2;
printf("YES\n%d\n", ans);
return 0;
}
int gcd(int x, int y)
{
if (x == 0)
return y;
return gcd(y%x, x);
}
time limit per test:2 seconds
memory limit per test:256 megabytes
input:standard input
output:standard output
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. .
![](http://codeforces.com/predownloaded/95/64/9564b5d5792d464213a733bc62e19d424d991193.png)
.
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.
![](http://codeforces.com/predownloaded/ee/ed/eeed959e241062c1b7376e31c0fb68ca0c4afd9e.png)
is the biggest non-negative number d such that d divides bi for every i (1 ≤ i ≤ n).
Input
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
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.
Examples
Input
2
1 1
Output
YES
1
Input
3
6 2 4
Output
YES
0
Input
2
1 3
Output
YES
1
对于任意两个相邻的数进行操作的最终结果都会使他们都变为偶数,因此如果需要进行操作的话,最终目的都是使所有数都变为偶数。
如果相邻两个数位一奇一偶需要操作两次,两奇则需要操作一次这样的话只要On模拟一遍就能得出答案。如果一开始就符合条件直接输出0即可。
因此这一题没有NO的情况。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxm = 100005;
int a[maxm], b[maxm];
int gcd(int x, int y);
int main()
{
int n, i, j, k, sum, ans;
scanf("%d", &n);
for (i = 1;i <= n;i++)
{
scanf("%d", &a[i]);
b[i] = a[i];
}
sort(b + 1, b + 1 + n);
if (b
== 0)
ans = 5;
else
{
ans = b
;
for (i = n - 1;i >= 1;i--)
{
if (b[i] == 0)
continue;
ans = gcd(ans, b[i]);
}
}
if (ans > 1)
{
printf("YES\n0\n");
return 0;
}
ans = 0;
for (i = 1;i < n;i++)
{
if (a[i] % 2 == 0)
continue;
if (a[i + 1] % 2 != 0)
{
ans++;
a[i + 1] = 2;
}
else
{
ans += 2;
a[i + 1] = 2;
}
}
if (a
% 2 != 0)
ans += 2;
printf("YES\n%d\n", ans);
return 0;
}
int gcd(int x, int y)
{
if (x == 0)
return y;
return gcd(y%x, x);
}
相关文章推荐
- CF#798 C. Mike and gcd problem(思维)
- 798 C. Mike and gcd problem
- Codeforces Round #410 (Div. 2) Mike and gcd problem 思维
- Codeforces Round #410 (Div.2) C.Mike and gcd problem-数学
- Mike and gcd problem
- C. Mike and gcd problem
- CF --- 798 C Mike and gcd problem 【思维】
- C. Mike and gcd problem
- Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)
- codeforces 798C - Mike and gcd problem 贪心
- Codeforces Round #410 (Div. 2) C. Mike and gcd problem 贪心
- 【算法系列学习】codeforces C. Mike and gcd problem
- 【推导】Codeforces Round #410 (Div. 2) C. Mike and gcd problem
- Codeforces 798C:Mike and gcd problem【数论+贪心】
- D - Mike and gcd problem
- 【codeforces 798C】Mike and gcd problem
- C. Mike and gcd problem-递推或者贪心
- Codefroces 410 C. Mike and gcd problem
- Codeforces-798C-Mike and gcd problem(贪心+数论)
- Mike and gcd problem Codeforces Round #410 (Div. 2)