P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题

P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题

题意描述

给出 a ,求一组构造 b,c,d 使得 a+b+c+d=gcd(a,b)+lcm(c,d)

同时需要保证 b,c,d1634826193

思路

变量实在太多了,考虑先大胆消掉一个,令 b=1 ,此时问题简化为使得 a+c+d=lcm(c,d)

赛时真的没想出来那么 nb 的构造,只想出来了一个 c=2a,d=3a ,的确可以得到部分分,但是有一部分答案超出了题目要求的范围。

正解

由于原题明显地给出了 a 为奇数的部分分,所以思考一下奇数的时候如何构造。

b=1 照旧,此时我们至少需要 lcm(c,d)c+d ,并且还要带有一个 a .

尝试构造 c=2,d=a,lcm(c,d)=2a ,发现右边少了 2

调整 da+2 ,仍然满足 c,d 互质,且满足了原构造。

那么接下来考虑 a 为偶数的情况,直觉上来说是可以往奇数的情况靠拢的,那么把 a 中的 2 全部除净变成 a ,就回到了奇数的情况,由于 :

gcd/lcm(x,y) 都满足 gcd/lcm(kx,ky)=kgcd/lcm(x,y) ,所以只需要把除掉的 2 乘回去就 ok 了。

//GCD LCM
#include<bits/stdc++.h>
using namespace std;
inline long long div(long long x)
{
int cnt=0;
while(x%2==0)
{
cnt++;
x>>=1;
}
return 1ll<<cnt;
}
int main()
{
int T,a;
cin>>T;
while(T--)
{
scanf("%d",&a);
if(a%2)
printf("%d %d %d\n",1,2,a+2);
else
{
long long d=div(a);
printf("%lld %lld %lld\n",d,d<<1,a+2*d);
}
}
return 0;
}
posted @   Hanggoash  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效
动态线条
动态线条end
点击右上角即可分享
微信分享提示