【C题】Educational Codeforces Round 83 (Rated for Div. 2)

在这里插入图片描述
题意:
给你 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;如果没出现过,就继续存;
在这里插入图片描述

发布了62 篇原创文章 · 获赞 0 · 访问量 661

猜你喜欢

转载自blog.csdn.net/weixin_44745441/article/details/104900755