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

}
posted @ 2025-03-26 10:41  _Yxc  阅读(7)  评论(0)    收藏  举报