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");}