1. 问题描述:
给定一个长度为 n 的数组 v1,v2,…,vn。初始时,数组中的所有元素都为 0。接下来,可以对该数组进行若干次如下操作------对于第 i 次操作(i 从 0 开始),你可以:
要么选择其中一个元素 vpos,将其增加 ki。
要么不选择任何元素,直接跳过此次操作。
你可以随时停止操作(不进行任何操作也可以)。现在,给定 k 的值以及一个目标数组 a1,a2,…,an。请问,能否通过上述操作,将数组 v 转化为数组 a。
输入格式
第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含两个整数 n,k。第二行包含 n 个整数 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
来源:https://www.acwing.com/problem/content/3730/
2. 思路分析:
分析题目可以知道每一次加上的是k的i次幂,所以我们可以考虑k进制来解决,我们可以将a中的每一个数字转为k进制,使用一个数组或者列表s来统计每一位中1的数目,可以发现第j位最多有1个1,所以最后判断每一位是否最多有1个1,如果大于了1说明不符合要求,小于等于1才满足要求。
3. 代码如下:
from typing import List
class Solution:
def process(self):
T = int(input())
for c in range(T):
n, k = map(int, input().split())
a = list(map(int, input().split()))
N = 100
cnt = [0] * N
for i in range(n):
x, j = a[i], 0
while x > 0:
cnt[j] += x % k
x //= k
j += 1
flag = 1
for i in range(N):
if cnt[i] > 1:
flag = 0
break
if flag:
print("YES")
else:
print("NO")
if __name__ == '__main__':
Solution().process()