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);
}
}
}