P11036 【MX-X3-T3】「RiOI-4」GCD 与 LCM 问题
题意描述
给出 \(a\) ,求一组构造 \(b,c,d\) 使得 \(a+b+c+d=gcd(a,b)+lcm(c,d)\)
同时需要保证 \(b,c,d\le 1634826193\)
思路
变量实在太多了,考虑先大胆消掉一个,令 \(b=1\) ,此时问题简化为使得 \(a+c+d=lcm(c,d)\)
赛时真的没想出来那么 nb 的构造,只想出来了一个 \(c=2a,d=3a\) ,的确可以得到部分分,但是有一部分答案超出了题目要求的范围。
正解
由于原题明显地给出了 \(a\) 为奇数的部分分,所以思考一下奇数的时候如何构造。
令 \(b=1\) 照旧,此时我们至少需要 \(lcm(c,d)\ge c+d\) ,并且还要带有一个 \(a\) .
尝试构造 \(c=2,d=a,lcm(c,d)=2a\) ,发现右边少了 \(2\) 。
调整 \(d\) 为 \(a+2\) ,仍然满足 \(c,d\) 互质,且满足了原构造。
那么接下来考虑 \(a\) 为偶数的情况,直觉上来说是可以往奇数的情况靠拢的,那么把 \(a\) 中的 \(2\) 全部除净变成 \(a'\) ,就回到了奇数的情况,由于 :
\(gcd/lcm(x,y)\) 都满足 \(gcd/lcm(kx,ky)=k\cdot gcd/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;
}
标签:LCM,gcd,奇数,T3,long,lcm,GCD
From: https://www.cnblogs.com/Hanggoash/p/18410838