乘方相加

给定一个长度为 nn 的数组 v1,v2,,vn

初始时,数组中的所有元素都为 0

接下来,可以对该数组进行若干次如下操作------对于第 i 次操作(i 从 0 开始),你可以:

  • 要么选择其中一个元素 v[pos],将其增加 k^i
  • 要么不选择任何元素,直接跳过此次操作。

你可以随时停止操作(不进行任何操作也可以)。

现在,给定 k 的值以及一个目标数组 a1,a2,,an.

请问,能否通过上述操作,将数组 v 转化为数组 a

输入格式

第一行包含整数 TT,表示共有 TT 组测试数据。

每组数据第一行包含两个整数 n,k

第二行包含 nn 个整数 a1,a2,,an

输出格式

每组数据输出一行结果,能将数组 v 转化为数组 a,则输出 YES,否则输出 NO

数据范围

对于前三个测试点,1T5
对于全部测试点,1T10001n302k1000ai10^16

输入样例:

5
4 100
0 0 0 0
1 2
1
3 4
1 4 1
3 2
0 1 3
3 9
0 59049 810

输出样例:

YES
YES
NO
NO
YES

这个题的意思就是说给你一个全0的数组,然后对于第i次操作,然后每一次你可以选择数组中的数字,然加上k^i,
问你能不能最后变成目标数字
其实这个题要反着考虑,就是把这个目标数组拆成k进制,如果第i为大于1的话,就不行,等与0没事因为他可以跳过的,
就是这样判断一下
#include<iostream>
#include<algorithm>
#include<cstring>
typedef long long ll;
using namespace std;
const int maxn=1e3+100;
int s[maxn];
int main(){
    int t;
    cin>>t;
    while(t--){
        memset(s,0,sizeof(s));
        int n,k;
        cin>>n>>k;
        while(n--){
            ll x;
            cin>>x;
            for(int j=0;x;j++,x/=k){
                s[j]+=x%k;
            }
        }
        int flag=0;
        for(int i=0;i<=1e2;i++){
            if(s[i]>1){
                flag=1;
                break;
            }
        }
        if(flag){
            cout<<"NO"<<endl;
        }    
        else{
            cout<<"YES"<<endl;
        }
    }
}

 



posted @ 2021-07-16 16:19  lipu123  阅读(112)  评论(0)    收藏  举报