CodeForces - 1312C. Adding Powers
原题地址:
http://codeforces.com/contest/1312/problem/C
基本题意:
给你一个n个元素的数组a和一个数k,问你能否将一个开始全为零的数组每次加k ^ i,使得这个数组变为数组a,每个 i 最多使用一次,即不能多次使用一个 i 。
基本思路:
这题本质上就是一个进制装换,我们把数组a中的每个数转换为k进制,因为每个i最多使用一次,所以枚举每个位,每个位的和不大于1即可以否则就不行。
参考代码:
#include <bits/stdc++.h>
using namespace std;
#define IO std::ios::sync_with_stdio(false)
#define int long long
#define INF 0x3f3f3f3f
const int maxn = 35;
int n,k,a[maxn];
int memo[maxn][64];
void judge(int pos,int m){
int x = a[pos];
int top = 0;
while (x > 0){
memo[pos][top++] = x % k;
x /= m;
}
}
signed main() {
IO;
int t;
cin >> t;
while (t-- > 0) {
cin >> n >> k;
memset(memo,0, sizeof(memo));
for (int i = 0; i < n; i++) cin >> a[i];
for (int i = 0; i < n; i++) {
judge(i, k);
}
bool v = true;
for (int i = 63; i >= 0; i--) {
int sum = 0;
for (int j = 0; j < n; j++) {
sum += memo[j][i];
}
if (sum > 1) v = false;
}
if (v) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}