CF#798 C. Mike and gcd problem(思维)
2017-04-24 15:57
519 查看
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.
.
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 numbersai, 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).
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
output
input
output
input
output
Note
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 ,我们可以将相邻两元素 a [ i ] , a [ i + 1 ] 改为 a [ i ] - a [ i + 1 ] 和 a [ i ] + a [ i + 1 ] ,问至少多少次操作后能使 gcd ( A1 ~ An) 大于1,若无法完成,则输出 NO
思路:显然我们把所有奇数修改成偶数即可满足条件,每次修改时若 a [ i ] 和 a [ i + 1 ] 同为奇数则修改一次,若一奇一偶则修改两次
#include<bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
int n;
int a
,c
;
int gcd(int n,int m)
{
int t = 1;
while(t)
{
t = n % m;
n = m;
m = t;
}
return n;
}
int main()
{
while(scanf("%d", &n) == 1)
{
memset(c,0,sizeof(c));
for(int i=0; i < n; i++)
{
scanf("%d",& a[i]);
}
int ans = 0,tmp = gcd(a[0], a[1]);
for(int i = 0; i < n; i++)
{
tmp = gcd(tmp, a[i]);
if(a[i] & 1 && !c[i])
{
if(a[i + 1] & 1) ans++;
else ans += 2;
c[i] = 1;
c[i + 1] = 1;
}
}
if(tmp != 1) printf("YES\n0\n");
else printf("YES\n%d\n", ans);
}
}
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.
.
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 numbersai, 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).
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
Note
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 ,我们可以将相邻两元素 a [ i ] , a [ i + 1 ] 改为 a [ i ] - a [ i + 1 ] 和 a [ i ] + a [ i + 1 ] ,问至少多少次操作后能使 gcd ( A1 ~ An) 大于1,若无法完成,则输出 NO
思路:显然我们把所有奇数修改成偶数即可满足条件,每次修改时若 a [ i ] 和 a [ i + 1 ] 同为奇数则修改一次,若一奇一偶则修改两次
#include<bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
int n;
int a
,c
;
int gcd(int n,int m)
{
int t = 1;
while(t)
{
t = n % m;
n = m;
m = t;
}
return n;
}
int main()
{
while(scanf("%d", &n) == 1)
{
memset(c,0,sizeof(c));
for(int i=0; i < n; i++)
{
scanf("%d",& a[i]);
}
int ans = 0,tmp = gcd(a[0], a[1]);
for(int i = 0; i < n; i++)
{
tmp = gcd(tmp, a[i]);
if(a[i] & 1 && !c[i])
{
if(a[i + 1] & 1) ans++;
else ans += 2;
c[i] = 1;
c[i + 1] = 1;
}
}
if(tmp != 1) printf("YES\n0\n");
else printf("YES\n%d\n", ans);
}
}
相关文章推荐
- CF --- 798 C Mike and gcd problem 【思维】
- Codeforces Round #410 (Div. 2) Mike and gcd problem 思维
- CF#798 B. Mike and strings(思维)
- [CF798C] Mike and gcd problem(规律,gcd)
- Codeforces 798C:Mike and gcd problem
- 798 C. Mike and gcd problem
- Codeforces 798C:Mike and gcd problem【数论+贪心】
- Mike and gcd problem CodeForces - 798C
- 【codeforces 798C】Mike and gcd problem
- C. Mike and gcd problem
- 789C Mike and gcd problem
- Codeforces Round #410 (Div.2) C.Mike and gcd problem-数学
- 【推导】Codeforces Round #410 (Div. 2) C. Mike and gcd problem
- Mike and gcd problem Codeforces Round #410 (Div. 2)
- codeforces 798C - Mike and gcd problem 贪心
- CF798B:Mike and strings(Hash)
- Codeforces Round #410 (Div. 2)C. Mike and gcd problem(数论)
- [CF798B] Mike and strings(暴力)
- CF 361 E. Mike and Geometry Problem (排列组合+乘法逆元)
- Codefroces 410 C. Mike and gcd problem