传送门
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;
}