[CF798C] Mike and gcd problem(规律,gcd)
题目链接:http://codeforces.com/contest/798/problem/C
题意:给n个数,和一种操作:把a(i)和a(i+1)变成a(i)-a(i+1)和a(i)+a(i+1)。问能不能把整个数列变成gcd>1,能的话输出最少步骤。
贪心地认为假如需要这种操作,那么gcd为2是最好的。
进行操作无非四种情况:奇奇 奇偶 偶奇 偶偶。奇偶和偶奇可以看成一种情况,而偶偶则不需要进行操作。只剩下奇奇。
进行一次操作后,会发现奇奇会变成偶偶。
再看奇偶,奇偶进行一次会变成奇奇,再进行一次就是偶偶。
那么先把奇奇的处理了,再找奇偶,偶奇的情况就行了。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 const int maxn = 100100; 5 int n, a[maxn]; 6 7 int main() { 8 // freopen("in", "r", stdin); 9 while(~scanf("%d", &n)) { 10 int g = 0; 11 for(int i = 1; i <= n; i++) { 12 scanf("%d", &a[i]); 13 g = __gcd(g, a[i]); 14 if(a[i] & 1) a[i] = 1; 15 else a[i] = 0; 16 } 17 if(g != 1) { 18 puts("YES\n0"); 19 continue; 20 } 21 int ret = 0; 22 for(int i = 1; i < n; i++) { 23 if(a[i] && a[i+1]) { 24 a[i] = a[i+1] = 0; 25 ret++; 26 } 27 } 28 for(int i = 1; i <= n; i++) { 29 if(a[i]) ret += 2; 30 } 31 printf("YES\n%d\n", ret); 32 } 33 }