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,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;
}
posted @ 2024-09-12 18:57  Hanggoash  阅读(35)  评论(0)    收藏  举报
动态线条
动态线条end