CF --- 798 C Mike and gcd problem 【思维】

传送门
//题意给定一个序列, 问最少操作几次可以使这个序列的GCD大于1. 每次操作是指选取一个数a[i], 删去a[i]和a[i+1]. 并替换成a[i] - a[i-1], a[i] + a[i+1].
//思路: 首先分析是可以知道的一定会输出YES, 因为当全部都是偶数时就一定可以啊, a[i] - a[i-1], a[i] + a[i+1]这个操作一定是可以将奇数变成偶数的, 最多进行两次, 所以当全部都变成偶数时也就是我们所需要的序列了. 所以直接模拟做就行了, 最后记得判一下最后那个数是不是奇数. 是的话答案要加2. (不懂的话仔细看看代码理解理解就行了)

AC Code

/** @Cain*/
const int maxn=1e5+5;
int a[maxn];
void solve()
{
    int n;
    while(~scanf("%d",&n)){
        int g;
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            if(i == 1) g = a[i];
            else g = __gcd(g,a[i]);
        }
        if(g > 1 ){
            printf("YES\n0\n");
            continue;
        }  //此时序列的总GCD一定是1.
        int res = 0;
        for(int i=1;iwhile(a[i] & 1){
                res++;
                int x = a[i]-a[i+1];
                int y = a[i]+a[i+1];
                a[i] = x; a[i+1] = y;
            }  //全部变成偶数.
        }
        if(a[n] & 1) res += 2;  //特判最后一个数
        puts("YES");
        printf("%d\n",res);
    }
}

你可能感兴趣的:(想法思维题)