cf--contest1312:C. Adding Powers

传送门

http://codeforces.com/contest/1312/problem/C

题意

给出一个原零数组长度为n,再给出一个底数k,和一个目标数组a0,a1…an-1。将原数组按照以下方式调整:
1.原数组不做任何改动
2.数组的元素可以放入k的i次方。可以放入多个ki,但前提是i只能用一次。

思路

依次枚举每个元素,找出每个元素取余k的最大的i次方后,剩下的数就是i走过的路径。标记每个位置,只能走一次。如果余数大于1,说明不是其中的数构成的。具体看代码

AC代码

#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
const int MAXN=65;
bool vis[MAXN];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(vis,false,sizeof(vis));
		int n,k;
		bool flag=true;
		scanf("%d%d",&n,&k);
		for(int i=0;i<n;i++)
		{
			ll x;
			scanf("%lld",&x);
			for(int j=0;j<MAXN;j++)//枚举每一个位置是否走过 
			{
				int y=x%k;
				x/=k;
				if(y>1)	flag=false;//如果不是其中的数构成 
				else if	(y==1) 
				{
					if(vis[j])	flag=false;//如果被走过,就不满足条件 
					vis[j]=true;//标记i位置被走过 
				}	
			}
		}
		if(flag)	puts("YES");
		else	puts("NO");
	}
	return 0;
}
发布了52 篇原创文章 · 获赞 1 · 访问量 879

猜你喜欢

转载自blog.csdn.net/qq_45249273/article/details/104767913
今日推荐