题目链接

https://codeforces.com/problemset/problem/1312/C

解题思路

这应该都知道吧:
图片说明
图片说明
x除以1个k,再对k取模得到的是权重为k^1的系数,即组成x需要系数个k^1;x除以2个k,对k取模得到的是权重为k^2的系数,即组成x还需要系数个k^2……
累计所有数的需要不同权重的个数,只要存在一个权重的个数大于1,就不满足题意。

AC代码

#include<bits/stdc++.h>
#define ll long long

using namespace std;
const int N=70;

int T,n,k,num,f,cnt[N];
ll a[N];
int main()
{
    cin>>T;
    while(T--)
    {
        cin>>n>>k;
        memset(cnt,0,sizeof cnt);
        f=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
            ll tmp=a[i];
            num=0;
            while(tmp)
            {
                ll mm=tmp%k;
                if(mm>1)//余数超出1个,直接break了
                {
                    f=1;
                    break;
                }
                else if(mm==1)//余数为1,统计上,若统计上之后比1大了,也break
                {
                    if(++cnt[num]>1)
                    {
                        f=1;
                        break;
                    }
                }//余数为0没影响
                tmp/=k;//不断除以k
                num++;//控制指数
            }
        }
        if(f) puts("NO");
        else puts("YES");    
    } 
}