第一题:https://codeforces.ml/contest/1720/problem/A

构造前置题,唯一构造:大意是给出abcd,a/b  c/d的分数。他可以让abcd乘以任意一个整数,使得两个分数相同,求最少操作次数。

你需要想办法使得两个数相同,找到这个数,这个是构造的核心。次数很明显只有0 1 2 三种情况。
那么需要考虑什么情况下是012. 

直觉告诉我跟gcd是相关的,如果是0,那么两个分数的最简情况是相同的。
那么什么是1 ,什么是2 ?如果是1,我们只需要动任意一个。如果是2 ,我们都需要动。

————————————————————————————————————————————————————
猜想1:如果分母或分子存在一组是互质貌似就需要  两次操作?
证明:无法证明 ,反例   3/6  6/8
猜想2:如果两个分数都化简成最简形式,那么如果存在一个相等,另一个可以整除貌似就可以1次解决了?
证明:如果两个分数化简为a/b c/b c%b==0,那么一定存在a乘以一个整数=c,如果模除不了需要pass。
同一证明:分数与最简分数的形式是一样的。除去的数仍需要1来控制。~~~~pass

—————————————————————————————————————————————————————

猜想全是错误的。 正解为  a*d   或  b*c 能存在整除就是1. 
我该如何思考这个问题。因为  第一个式子的分子 很难  想象和另一个式子的分母考虑到一起。这是一个思考的局限性。

看了https://blog.csdn.net/m0_64929249/article/details/126426189  这篇博客找到了思考的点。
考虑将分母化成同一个,然后看分子是否可以整除  a*d 就相当于 a*d/bd   和   b*c/bd这样分母就一样了。确实没有考虑这一点。我是fw

code:

void solve()
{
	ll a,b,c,d;
	cin>>a>>b>>c>>d;
	ll t = __gcd(a,b);
	a=a/t;
	b=b/t;
	t = __gcd(c,d);
	c=c/t;
	d=d/t;
	if(a==c&&b==d||a==0&&b==0){
		cout<<0<<endl;
		return;
	}else if(a==0||c==0||max(a*d,b*c)%min(a*d,b*c)==0){
		cout<<1<<endl;
		return;
	}else{
		cout<<2<<endl;
		return;
	}
}

 

第二题:https://codeforces.ml/contest/1684/problem/B

大意是给出 a,b,c  找出 存在x%y=a  y%z=b  z%x = c这样的xyz
非常经典的构造题

如何思考这个问题?  x=a+b+c+c+a  y=a+b+c+c+b  z=a+b+c+c        

_______________________________________________________________________
想了很久,还是想不出来,构造题这一块是真的弱,这么简单的题也不会。寄了

z的构造很特殊,只需要前面的全都增,c必定小

令z =  c,使得  y = b+c  ,这样x=a+b+c。完成。

code:

void solve()
{
	int a,b,c;
	cin>>a>>b>>c;
	cout<<a+b+c<<' '<<b+c<<' '<<c<<endl; 
}

 

第三题:https://codeforces.ml/contest/1744/problem/E1

存在 a<x<=c  , b<y<=d.  构造出一对xy  使得x*y %  a*b ==0
时间限制 : 1s 数据范围 1e5

从时间范围中推算出  这个题 n或nlog这种级别。n^n是最容易想到的,如果能够通过更改步长也将会是一个不错的速度(如果可行的话qaq)

首先x和y一定分摊了   ab的所有" 质因子 ",这是我在临比赛结束时想明白的一点。在补题时发现这个点是正确的.

正确的方法就是找到当前包含 (x不包含的质因子)且能够整除a*b的一个数。然后根据这个数k来计算出存在于b-d中满足范围的y值

code:

void solve()
{
	ll a,b,c,d;
	cin>>a>>b>>c>>d;
	for(ll x=a+1; x<=c; x++){
		ll k=a*b/__gcd(a*b,x);  //  给出一个最小的可以满足的y值,这样最后的y一定是一个k的某个倍数 
		ll y = (b/k+1)*k;
		if(y>b&&y<=d/*b/k!=d/k*/){  //其实就是判断在这个范围内 
			ll y = (b/k+1)*k;   //  计算正好在这个范围内的y值 
			cout<<x<<" "<<y<<endl;
			return;
		}
	}
	cout<<-1<<' '<<-1<<endl;
}