CodeForces-Divisible Numbers (easy version)

题目

前言

对于数论的题目 果然还是多想想gcd吧 不过这个题目看的不错 竟然结合了gcd lcm

是我的大脑旋转

思路

首先 我们一定要明白一个东西

ab|xy 中 ab含有的因子 xy也必须要全部用

然后ab/(gcd(ab,x)和y的关系是这样的 首先gcd挑选了ab和x的共有最大的公因子 那么这么ab一除下来的东西,ab减去那个gcd的还剩下因子 y必须全部含有 而且可能y还有的多别的因子

所以有ab/(gcd(ab,x)|y

我们两边同*x 会发现左边就是lcm(ab,x)于是
y就是

k* lcm(ab,x)/x

k是多出的因子 但是我们贪心的肯定要它为1的不超过d嘛
所以忽略了

然后求出了的这个 其实你会发现 会小于b的 因为我们写这个程序没有规定他是最小从b+1开始的

比如

3 4 5 7

我们会算出答案 4 3 于是我们可以用这个小技巧 其实也碰到过很多次了

b/y+1)*y

就是不低于b的最小y倍数了

于是就可以看它和d的关系了 可以就输出

#include<bits/stdc++.h>
#define int long long 
#define endl '\n'
using namespace std;
const int range=2e5+10;
int n;
int a,b,c,d;
void solve()
{
	
	// a b c d 
	//a<c  b<d 
	// x*y%a*b
	//
	//x*y|a*b 
	//    12 
	cin>>a>>b>>c>>d;
	for(int x=a+1;x<=c;x++)
	{
		int g=__gcd(x,a*b);	
		int y=(a*b)/g;	
		//y=(a*b*x)/g/x
		int maxn=(b/y+1)*y;
		//非常好的一步向上取 又最小 
		//mind
		//	int p = m / ans * ans; 取最大
		if(maxn<=d)
		{
			cout<<x<<" "<<maxn<<endl;
			return ;
		}
	}
	cout<<-1<<" "<<-1<<endl;
	return ;
}
posted @ 2025-04-16 19:43  LteShuai  阅读(8)  评论(0)    收藏  举报