题目链接:http://codeforces.com/problemset/problem/798/C
题意:给你n个数,a1,a2,....an。要使得gcd(a1,a2,....an)>1,可以执行一次操作使ai,ai+1变为ai - ai + 1, ai + ai + 1。求出使得gcd(a1,a2,....an)>1所需要的最小操作数。
解题思路:首先,要知道如果能够实现gcd(a1,a2,....an)>1,那么a1~an肯定都是偶数(0也是偶数),所以我们的目的就是用最少的操作次数把所有数变成偶数。如果两个数都是奇数,那需要操作一次(奇数加减变成偶数),如果是偶数和奇数,那需要操作两次(奇数和偶数加减得到奇数,奇数再和奇数加减得到偶数),所以不存在gcd不能大于1的情况
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 const int N=1e5+5; 5 int gcd(int a,int b){ 6 return b==0?a:gcd(b,a%b); 7 } 8 9 int main(){ 10 int n,tmp=0; 11 int a[N]={0}; 12 cin>>n; 13 for(int i=1;i<=n;i++){ 14 cin>>a[i]; 15 tmp=gcd(tmp,a[i]); 16 } 17 if(tmp!=1)//如果不需要操作就得到gcd>1,直接输出0次; 18 cout<<"YES"<<" "<<"0"<<endl; 19 else{ 20 int ans=0; 21 for(int i=1;i<n;i++){//找奇奇 22 if(a[i]&1&&a[i+1]&1){ 23 ans++; 24 a[i]=a[i+1]=2; 25 } 26 } 27 for(int i=1;i<n;i++){ 28 if(a[i]&1||a[i+1]&1){//找奇偶或者偶奇 29 ans+=2; 30 a[i]=a[i+1]=2; 31 } 32 } 33 cout<<"YES"<<endl; 34 cout<<ans<<endl; 35 } 36 return 0; 37 } 38 39
。因为要求的最小操作数,所以我们要先找奇奇的情况,再找奇偶或者偶奇的情况。