P13098 [FJCPC 2025] 构造大师贝贝
题目描述
贝贝励志成为 FJ-ACM 中最强的构造选手,于是他每日苦练构造题。
为了检验贝贝的训练成果,宁宁同学提出了一道十分甚至九分困难的构造题来检验他的学习成果:
给定一个正整数 nnn,请在 100100100 次操作以内,将其变为一个完全平方数。每次操作的内容为如下:
-
选择一个当前数字 nnn 的约数 xxx,即 n mod x=0n \bmod x = 0nmodx=0;
-
每次选择的 xxx 需跟之前任何一次选择的都不同;
-
随后让 nnn 加上 xxx。
在整个操作过程中,nnn 不允许超过 101810^{18}1018。
这可难坏了贝贝,于是他找到了无比聪明的你来解决这个问题。
其中,n mod xn \bmod xnmodx 表示 nnn 除以 xxx 的余数。
输入格式
本题包含多组评测用例。
第一行,包含一个整数 T(1≤T≤1000)T( 1\le T \le 1000 )T(1≤T≤1000),表示评测用例组数。
接下来的 TTT 行,一行一个正整数 n(1≤n≤1012)n(1\le n\le 10^{12})n(1≤n≤1012)。
输出格式
对于每组评测用例:
第一行,输出一个整数 m(0≤m≤100)m(0\le m\le 100)m(0≤m≤100),表示操作次数。
第二行,包含 mmm 个由空格分隔的不同的数字,表示每次操作所加上的数字 xxx。
在整个操作过程中,你需要保证 nnn 不超过 101810^{18}1018。
输入输出样例 #1
输入 #1
2
2025
182
输出 #1
0
3
7 3 4
说明/提示
对于第 111 个评测用例的说明如下:
- 因为 2025=45×452025=45\times 452025=45×45 原本就是平方数,故无需操作。
对于第 222 个评测用例的说明如下:
-
第一次操作:
-
选择 x=7x=7x=7,数字 777 是 182182182 的因子;
-
令 n:=182+7=189n:=182+7=189n:=182+7=189。
-
-
第二次操作:
-
选择 x=3x=3x=3,数字 333 是 189189189 的因子且 333 不在之前选择的数字集合 {7}\{7\}{7} 中;
-
令 n:=189+3=192n:=189+3=192n:=189+3=192;
-
-
第三次操作:
-
选择 x=4x=4x=4,数字 444 是 192192192 的因子且 444 不在之前选择的数字集合 {7,3}\{7,3\}{7,3} 中;
-
令 n:=192+4=196n:=192+4=196n:=192+4=196;
-
196=14×14196=14\times 14196=14×14 是完全平方数,结束。
-
其中 :=:=:= 表示赋值符号。
C++实现
#include<bits/stdc++.h>
#define int long long
using namespace std;
int lowbit(int x){return x&(-x);}
void solve(){
int n;
cin>>n;
vector<int>ans;
while(((int)sqrt(n))*((int)sqrt(n))!=n){
ans.push_back(lowbit(n));
n+=lowbit(n);
}
cout<<ans.size()<<'\n';
for(int i=0;i<ans.size();i++)cout<<ans[i]<<' ';
if(ans.size())puts("");
}
signed main(){
int t;
cin>>t;
while(t--)solve();
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
2188

被折叠的 条评论
为什么被折叠?



