第一题: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; }