题意:
给你 n,k;
n代表数组的长度,
给你一个数组a
问你 是不是能通过规定操作 使一个初始化为0的数组 变成这个数组
题意弯弯绕绕的,实际上就是问 给你的这个数组的每个值,是否都是加上一些k的几次方得来的,而且这个几次方不能重叠,比如一个数是23+24 另一个数是23 +25 ,那么这个给定的数组就是错误的。
比赛的思路:
没思路…我是菜鸡…
题解:
while(t--){
scanf("%d%d",&n,&m);
memset(cnt,0,sizeof(cnt));
int ok=1;
for(int i=0;i<n;i++){
ll x;
scanf("%lld",&x);
for(int j=0;x;j++,x/=m){
int tmp=x%m;
if(tmp>1) ok=0;
else if(tmp==1) {
if(cnt[j]) ok=0;
cnt[j]++;
}
}
}
printf("%s\n",ok?"YES":"NO");
}
cnt数组 存的是k的几次方已经出现过;
每次读进来的数,其实都不用放进数组。
每次读进来一个 用for循环判断一下就好了;
如果 n%k>1 那么这个数肯定不是k的几次方之和
如果n%k==1 句说明 和里面有一个k的几次方已经被除到1了
这个时候判断一下当前是第几次循环,也就是这个加数是k的几次方,如果出现过了,直接判ok=0;如果没出现过,就继续存;