乘方相加
给定一个长度为 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。
数据范围
对于前三个测试点,1≤T≤5。
对于全部测试点,1≤T≤1000,1≤n≤30,2≤k≤100,0≤ai≤10^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; } } }

浙公网安备 33010602011771号