Marbelous Meena(合并至一堆YES or NO)

原题: https://cn.vjudge.net/problem/Gym-101864I

题意:

n堆石子,一堆石子数为x的可以一次从其他堆获得x,问是否可以合并成一堆

解析:

因为是x,2x这种关系,所以123和246没有区别,即除去所有数的gcd

而合并是x+y->2x+(y-x)那么假设和为sum,需要通过sum/2和sum/2来合并,sum/2需要从sum/4和sum/4合并,所以这个sum必须是2^k


接下来验证sum=2^k一定可以合并成一堆:

在经过一系列变换后,一定可以出现2^(<k),例如:7 9->14 2 ,6 10->12 4 ,那么一直累加就变成sum/2了


而如果NO,那么加一堆直至sum=2^k即可

#include<bits/stdc++.h>
using namespace std;

long long a[100009];

long long gcd(long long a,long long b){
    if(b==0)return a;
    return gcd(b,a%b);
}

int main(){
    int t;scanf("%d",&t);int ca=0;
    while(t--){
        long long sum=0;
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%lld",a+i),sum+=(long long)a[i];
        long long g=gcd(a[1],a[2]);
        for(int i=3;i<=n;i++)g=gcd(g,a[i]);
        sum/=g;
        while(sum%2==0)sum/=2;
        if(sum==1){
            printf("Case %d: YES\n",++ca);
        }
        else{
            printf("Case %d: NO 1\n",++ca);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/82961535