C. Adding Powers
https://codeforces.com/contest/1312/problem/C
题意:给定一个长度为n的数组a,还有一个长度为n的数组v(初始时全是0),还有一个数值k。现可进行如下操作:将k^i添加到数组v的某个数中,或者不使用k ^ i。问不限操作次数的操作后,v能否变成a。
思路:依次考虑a中的某个数x,对x进行拆分,看组合成x需要使用k的哪几个幂次的数,如果使用的指数没有重复,那么则ok,否则寄。
总结:艰难的ac,思考了一会没思路,准备放弃了,后来又冷静下来,仔细分析了问题。考虑到了一种可行的解法。 有几个需要注意的点,就是求组合指数的时候,计算的终止条件问题。
inline void solve() {
int n, k;
cin >> n >> k;
vector<long long> a(n);
for (auto& x : a) {
cin >> x;
}
set<int> sett;
auto getMaxPower = [&](long long& x, long long& v) {
int res = 0;
v = 1;
while (v * k <= x) {
v *= k;
res ++;
}
return res;
};
bool ok = true;
for (auto x : a) {
if (!x) {
continue;
}
if (x == 1) {
if (!sett.insert(0).second) {
ok = false;
break;
}
}
else {
while (x >= 1){
long long v;
int i = getMaxPower(x, v);
if (!sett.insert(i).second) {
ok = false;
break;
}
if (x % v == 0) {
x /= v;
if (x == 1) {
break;
}
}
else {
x -= v;
}
}
}
}
cout << (ok ? "YES\n" : "NO\n");
}

浙公网安备 33010602011771号