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 ;
}

浙公网安备 33010602011771号