CF1312C Adding Powers 题解

题意:

对于一个初始全 \(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;
}
posted @   _XOFqwq  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示