题解 CF1864C Divisor Chain
题意
给定一个整数
你需要做这样的操作至多
求解将
分析
赛时找了很久规律,才发现是二进制拆分。
对
观察可以发现:
接着将
代码
//the code is from chenjh
#include<cstdio>
#include<algorithm>
#include<vector>
void solve(){
int x;scanf("%d",&x);
std::vector<int> v;//操作序列。
v.emplace_back(x);
int y=1<<std::__lg(x);//求 x 的 2 的最高次幂。
int z=x-y;
for(int i=0;i<=30;i++)if(z&(1<<i))v.emplace_back(x-=(1<<i));//从小到大减去这一位。
while(y>1)v.emplace_back(y>>=1);//每次砍半。
printf("%zu\n",v.size());
for(const int y:v) printf("%d ",y);
putchar('\n');
}
int main(){
int T;scanf("%d",&T);
while(T--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】