欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-05-01 23:04:48
...

原题: 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);
        }
    }
}