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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】