P13098 构造大师贝贝 题解
1. 题意解释
给出一个数
2. 思路
主播赛时切掉了这道抽象的构造题来讲一下心路历程。
最开始时肯定会想到往最近的完全平方数靠。
然而这样我们会发现,有些数字是无法变成与其最接近的完全平方数的。
例子:
与
主播本来这时候打算放弃了。
然而数竞的经历让主播想到了分类讨论和整除性。
我们考虑对
-
n\equiv1\pmod4
我们让
-
n\equiv2\pmod4
直接让
-
n\equiv3\pmod4
直接让
此时,对于所有
不难发现这样的操作可以一直持续直到
至于操作次数,最坏的情况是
而操作过程中
3. 代码实现
没什么特别难的地方,直接上主播的 code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t,n,cnt;
vector<int>vec;
void solve(int x,int a){
if(floor(sqrt(x))*floor(sqrt(x))==x){
cout<<cnt<<endl;
for(int i=0;i<vec.size();i++){
cout<<vec[i]<<" ";
}
cout<<endl;
}
else{
if(x%4==1){
cnt+=2;
vec.push_back(a);
vec.push_back(2*a);
solve((x+3)/4,a*4);
}
else if(x%4==2){
cnt++;
vec.push_back(2*a);
solve((x+2)/4,a*4);
}
else if(x%4==3){
cnt++;
vec.push_back(a);
solve((x+1)/4,a*4);
}
else{
solve(x/4,a*4);
}
}
}
signed main(){
cin>>t;
while(t--){
cin>>n;
cnt=0;
vec.clear();
solve(n,1);
}
return 0;
}