CF1312C Adding Powers 题解

Posted on 2024-03-03 18:35  _XOFqwq  阅读(10)  评论(0编辑  收藏  举报

题意:

对于一个初始全 \(0\) 的序列,问是否能够进行若干次操作(第 \(i\) 次操作为对序列中任意一个元素增加 \(k^i\)),使得此序列变为目标数组 \(a\)


首先,我们令需要进行操作的序列为 \(b\)

我们知道,如果能通过若干次操作将 \(b\) 变为 \(a\),则有以下三种情形:

  • \(a\) 中的元素全 \(0\)(初始时就达成了);

  • \(k=1\)(此时 \(k\) 的任意次方均为 \(1\));

  • 满足对于所有的 \(1 \le i \le n\),都有 \(a_i = k^{x_1} + k^{x_2} + ... +k^{x_y}\),且 \(x_1 \neq x_2 \neq ... \neq x_y\)(即 \(a\) 中的每个元素均可以被表示为 \(k\) 的若干次幂之和,并且这些指数均不相同)。

于是,我们首先特判前两种情形,再朴素地对于 \(a\) 中的某个元素去分解成若干个 \(k\) 的次幂之和,判断指数是否有重复即可。时间复杂度 \(O(n \log A)\),其中 \(A\) 表示 \(\max\{a_i\}\)

核心代码(用于将元素分解成若干个 \(k\) 的次幂之和,并判断指数是否重复):

bool check(int x){
	while(x){
		int base=1,power=0;
		while(base<=x) base*=k,power++;
		base/=k,power--,x-=base,vis[power]++;
		if(vis[power]>1) return 0;
	}
	return 1;
}