题意:
对于一个初始全 \(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;
}
标签:Adding,题解,元素,若干次,序列,Powers,neq
From: https://www.cnblogs.com/XOF-0-0/p/18050448