codeforce 798C Mike and gcd problem (简单数学)
2017-04-22 12:37
357 查看
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 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).
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序列,ai,ai+1−>ai−ai+1,ai+ai+1ai,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;
}
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 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).
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序列,ai,ai+1−>ai−ai+1,ai+ai+1ai,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;
}
相关文章推荐
- 数学之美 系列五 简单之美:布尔代数和搜索引擎的索引
- 数学之美 系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 简单的小学数学题
- 数学之美系列五 之 简单之美:布尔代数和搜索引擎的索引
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 征税到底亏了谁?简单数学背后的经济学原理
- 数学之美 系列五 – 简单之美:布尔代数和搜索引擎的索引
- 一个计算简单数学表达式值的算法。
- 简单语法分析-数学表达式
- 什么是数学:对特殊的1.8进制的简单研究
- 有一道十分简单的数学题,但是我就是没想出来,不得以发在首页求助
- 数学之美系列之五:简单之美--布尔代数和搜索引擎的索引
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 一道简单数学题!10人有11个人算错!!
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 有一道十分简单的数学题,但是我就是没想出来,不得以发在首页求助
- 【数学之美系列五】简单之美:布尔代数和搜索引擎的索引
- 数学之美系列五 -- 简单之美:布尔代数和搜索引擎的索引
- 一道简单数学题