打卡信奥刷题(2237)用C++实现信奥 P13098 [FJCPC 2025] 构造大师贝贝

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(1T1000),表示评测用例组数。

接下来的 TTT 行,一行一个正整数 n(1≤n≤1012)n(1\le n\le 10^{12})n(1n1012)

输出格式

对于每组评测用例:

第一行,输出一个整数 m(0≤m≤100)m(0\le m\le 100)m(0m100),表示操作次数。

第二行,包含 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,数字 777182182182 的因子;

    • n:=182+7=189n:=182+7=189n:=182+7=189

  • 第二次操作:

    • 选择 x=3x=3x=3,数字 333189189189 的因子且 333 不在之前选择的数字集合 {7}\{7\}{7} 中;

    • n:=189+3=192n:=189+3=192n:=189+3=192

  • 第三次操作:

    • 选择 x=4x=4x=4,数字 444192192192 的因子且 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值