【题目链接】:http://codeforces.com/contest/798/problem/C

【题意】



给你n个数字;

要求你进行若干次操作;

每次操作对第i和第i+1个位置的数字进行;



a[i]变为a[i]-a[i+1],a[i+1]变为a[i]+a[i+1];

然后问你能不能通过以上变换使得最后所有元素的gcd>1

【题解】



答案总是存在的;

因为把这个操作进行两次可以得到-2*a[i+1],2*a[i]

也就是如果对每相邻的元素进行操作,最后都能使得这两个元素都变成偶数;

最后gcd最少都为2了;

则:

如果一开始所有元素的gcd>1则直接输出0;

等于1;

假设改变一次后的gcd为d

则d|a[1..i-1]且d|a[i+2..n]

且d|a[i]-a[i+1]且d|a[i]+a[i+1]

因为由d|x和d|y可以得到

d|x+y以及d|x-y

所以

d|2*a[i]且d|2*a[i+1]

这样就大概猜测要使得每个元素都变成偶数吧.

每个元素都贪心地让他变成偶数就好了;

(有了“这个操作进行两次可以得到-2*a[i+1],2*a[i]”这个结论,我们可以放心地进行贪心,当然不一定是都要进行两次操作,比如a[i]和a[i+1]都是奇数,则只要进行一次操作,因为一次操作后两个数的奇偶性都会因为加、减了一个奇数而发生改变);

只要第i个元素没有变成偶数就一直进行这个操作;

然后第n个元素如果最后在前n-1个元素进行操作之后没有变成偶数;

则必然可以对n-1,n操作两次使得a[n-1]保留仍旧是偶数,a[n]也变成了偶数;

因为

a[n-1]是偶数了,a[n]是奇数

第一次操作后

a[n-1]变成奇数,a[n]还是奇数;

再进行一次操作后

a[n-1]变成偶数,a[n]也变成偶数;

具体看代码



【Number Of WA】



1



【完整代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 1e5+100;
const int INF = 21e8; int n;
LL a[N],now; LL gcd(LL a,LL b)
{
if (b==0)
return a;
else
return gcd(b,a%b);
} LL tgcd(LL a,LL b)
{
return gcd(abs(a),abs(b));
} void change(int x,int y)
{
LL ta = a[x]-a[y],tb = a[x]+a[y];
a[x] = ta,a[y] = tb;
} int main()
{
//cout << tgcd(12,3)<<endl;
//freopen("F:\\rush.txt","r",stdin);
ios::sync_with_stdio(false),cin.tie(0);//scanf,puts,printf就别用了!
cin >> n;
rep1(i,1,n)
cin >> a[i];
now = tgcd(a[1],a[2]);
rep1(i,3,n)
now = tgcd(now,a[i]);
cout <<"YES"<<endl;
if (now>1)
{
cout <<0<<endl;
return 0;
}
int ans = 0;
for (int i = 1;i <= n-1;i++)
{
while ((a[i]%2)!=0)
{
change(i,i+1);
ans++;
}
}
while ((a[n]%2)!=0)
{
change(n-1,n);
ans++;
}
cout << ans << endl;
return 0;
}

【codeforces 798C】Mike and gcd problem的更多相关文章

  1. 【codeforces 798A】Mike and palindrome

    [题目链接]:http://codeforces.com/contest/798/problem/A [题意] 让你严格改变一个字符,使得改变后的字符串为一个回文串; 让你输出可不可能; [题解] 直 ...

  2. 【codeforces 798B】Mike and strings

    [题目链接]:http://codeforces.com/contest/798/problem/B [题意] 给你n个字符串; 每次操作,你可以把字符串的每个元素整体左移(最左边那个字符跑到最后面去 ...

  3. 【codeforces 742B】Arpa’s obvious problem and Mehrdad’s terrible solution

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  4. 【codeforces 798D】Mike and distribution

    [题目链接]:http://codeforces.com/contest/798/problem/D [题意] 让你选一个下标集合 p1,p2,p3..pk 使得2*(a[p1]+a[p2]+..+a ...

  5. codeforces 798 C. Mike and gcd problem(贪心+思维+数论)

    题目链接:http://codeforces.com/contest/798/problem/C 题意:给出一串数字,问如果这串数字的gcd大于1,如果不是那么有这样的操作,删除ai, ai + 1 ...

  6. 【算法系列学习】codeforces C. Mike and gcd problem

    C. Mike and gcd problem http://www.cnblogs.com/BBBob/p/6746721.html #include<iostream> #includ ...

  7. Codeforces 798C. Mike and gcd problem 模拟构造 数组gcd大于1

    C. Mike and gcd problem time limit per test: 2 seconds memory limit per test: 256 megabytes input: s ...

  8. Codeforces Round #410 (Div. 2)C. Mike and gcd problem

    题目连接:http://codeforces.com/contest/798/problem/C C. Mike and gcd problem time limit per test 2 secon ...

  9. codeforces#410C Mike and gcd problem

    题目:Mike and gcd problem 题意:给一个序列a1到an ,如果gcd(a1,a2,...an)≠1,给一种操作,可以使ai和ai+1分别变为(ai+ai+1)和(ai-ai+1); ...

随机推荐

  1. Bean Query 改动Bug的版本号(1.0.1)已公布

    改动内容: 修复输入对象被排序的属性不存在或者为Null时出错的bug 在Maven项目中引用 <dependency> <groupId>cn.jimmyshi</gr ...

  2. css3 动态背景

    动态背景 利用多层背景的交替淡入淡出,实现一种背景在不停变换的效果,先看图. 效果图: DEMO地址 步骤 1.利用css的radial-gradient创建一个镜像渐变的背景.当中的80% 20%为 ...

  3. Codeforces Round #277 (Div. 2)C.Palindrome Transformation 贪心

    C. Palindrome Transformation     Nam is playing with a string on his computer. The string consists o ...

  4. C# 正则表达式 和 JAVA表达式是想通的

    正则表达式语法 也许有人会说,现在需要正则表达式去验证什么的话,直接在网上找不久一大片吗?还需要学什么啊! 是的,现在在网上找确实是一找一大片,但是,有时候我们也遇到这样的情况,就是我们在网上找的复制 ...

  5. git使用简易指南(转)

    创建新仓库 创建新文件夹,打开,然后执行 git init以创建新的 git 仓库. 检出仓库 执行如下命令以创建一个本地仓库的克隆版本:git clone /path/to/repository 如 ...

  6. Mvc程序字体加载失败问题

    在我们开发的asp.net-mvc项目中,有时会出现字体加载失败的现象,但是一检查字体文件目录,发现文件目录都是存在的且有效的,这是为何呢?原来需要再web.config文件中添价少许配置代码就搞定. ...

  7. POJ 2418 简单trie树

    Hardwood Species Time Limit: 10000MS Memory Limit: 65536K Total Submissions: 21845 Accepted: 8551 De ...

  8. 生成jsp验证码的代码详解(servlet版)

    package util; import java.util.*; import java.io.*; import java.awt.*; import java.awt.image.*; impo ...

  9. 【转载】JavaScript中同名标识符优先级-Snandy

    一,局部变量先使用后声明,不影响外部同名变量 var x = 1; // --> 外部变量x function fn(){ alert(x); // --> undefined 局部变量x ...

  10. Spring JPA 简单配置使用

    JPA 常用配置: # JPA (JpaBaseConfiguration, HibernateJpaAutoConfiguration) spring.data.jpa.repositories.b ...