3727 乘方相加(k进制)

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()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值