Codeforces Round #828 (Div. 3) E1 Divisible Numbers (easy version)

 

 

Problem - E1 - Codeforces

题意: 给定数字 a , b , c ,d 

寻找x , a<x<= c, 寻找 y , b<y <= d

且x*y % a*b == 0

思路:

从题目条件出发,tl给4s,a,b,c,d小于1e5,将区间[a,c]遍历不会T,暴力搜索x可行,但套两层循环暴力搜索x与y会T,故要根据x找出y。

将x*y % a*b == 0条件进行拆解,由数论基本定理: A%B==0 , 那么A的质因子集合包含B的质因子集合。

故当确定x时,a*b的一部分质因子便被x包含,我们只需要找出y,使y包含a*b的另一部分质因子。

eg:

a*b = p1*p2*p3*.......pn

x=p1*p2*p3

则我们需要找出y,使y的质因子包含p4*p5*....pn

此时再main函数外搓一个gcd求最大公约数函数,便能得出x和a*b共有的质因子连乘积

另x和a*b共有的质因子连乘积为m

则y为m的k倍,接下来就要求k,使b<k*m<=d

则我们只需要找出[b,d]中所有符合条件的y的最小值,使k*m恰好大于b即可,判断k*m <=d ?

假设 k*m == b , 则k == b/m

因为y > b ,故当m%b ==0,  k =( b+m)/m

当m % b != 0 ,      k =   (b+m-1)/m

#include <bits\stdc++.h>
using namespace std;
typedef int int_32;
#define int long long
int gcd(int a, int b) {
	if (b == 0)return a;
	if (a == 0) return b;
	return gcd(b, a % b);
}
int_32 main(void) {
	int t;
	cin >> t;
	while (t--) {
		int a, b, c, d, fl = 1;
		cin >> a >> b >> c >> d;
		int x, y;
		for (x = a + 1; x <= c; x++) {
			//needFact y需要包含的因子连乘积
			int needFact = a * b / gcd(x, a * b);
			if (needFact > d)continue;
			if (b % needFact == 0) y = (b + needFact) / needFact*needFact;
			else y = ((b + needFact - 1) / needFact) * needFact;
			if (y <= d) {
				cout << x << ' ' << y << endl;
				fl = 0;
				break;
			}
		}
		if (fl)cout << -1 << ' ' << -1 << endl;
	}
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值