题目链接:https://www.luogu.com.cn/problem/P3951
题目大意:
给出两个互质的整数a,b,求出使得ax+by=m(x,y为自然数)无解的最大整数m
分析:
(分析中先讨论a<b的情况,得到答案后可发现结果关于a,b具有轮换对称性,故a>b的情况可不予讨论)
画出数轴后,可以发现如果得到一条线段(定义:b个连续的整数)上的每个整数点都被覆盖(定义:该整数有解)了。那么值大于 该线段内的整数 的整数必然也是被覆盖了的。所以如果我们能找到首个长度为b的被完全覆盖的线段就能更接近我们需要的m。
同时我们还能发现如果上一条线段(从
i
+
1
i+1
i+1 ~
i
+
b
i+b
i+b的整数)中的整数
j
1
,
j
2
,
j
3
.
.
.
j_1,j_2,j_3...
j1,j2,j3...是被覆盖的,那么当前线段(从
i
+
b
+
1
i+b+1
i+b+1 ~
i
+
2
∗
b
i+2*b
i+2∗b 的整数)中的相应位置的
j
1
+
b
,
j
2
+
b
,
j
3
+
b
.
.
.
j_1+b,j_2+b,j_3+b...
j1+b,j2+b,j3+b...也是被覆盖的。从图中看更为直观:
图中红色部分为线段①就被覆盖的位置,可发现这些位置在线段②中的相应位置也是被覆盖的。而新增加的蓝色位置是由x的变化带来的,初始位置为a=3,x增加1,位置往后移动3格(碰到最右端返回最左端继续移动),每个被碰到的位置都会被覆盖。故可发现,每过一个区间,y+1(对应图中的m+7)并没有产生新位置,其作用只是让被覆盖的位置继承了下去。而只有x的变化带来的跳动产生了新的位置。故问题变成了跳动多少次能够让区间完全覆盖。
设跳动的周期为t,区间范围(0~b-1),那么 ( a + t ∗ a ) % b = a (a+t*a)\%b=a (a+t∗a)%b=a(a点出发跳动t次后回到a点),由于 a < b a<b a<b,故 a % b = a a\%b=a a%b=a,则 t ∗ a % b = 0 t*a\%b=0 t∗a%b=0,因为a,b互质,故 t=b。
所以可以发现在一个周期内,必然会经过区间内的所有点一次。(若某个点未被经过,且t=b,那么必然有个点经过了至少两次,而一个周期内不可能经过一个点两次)故可以看成在一个周期内,每次都会经过一个新的点,但是别忘了,一开始就经过的点还有b%b=0(区间上的),而0的下一个位置就是a(对应的 m = a + t ∗ a m=a+t*a m=a+t∗a),即b是周期内的最后一个点,所以我们只需找到0( m = t ∗ a m=t * a m=t∗a)的上一个位置( m = t ∗ a − a m=t*a-a m=t∗a−a)就是最后一个更新的点了。但是注意这个点并不是要求的最大m,因为该点(m=t*a-a)对应的区间是首个被完全覆盖的区间。它的上一个区间的对应位置( m = t ∗ a − a − b m=t*a-a-b m=t∗a−a−b)才是最后一个未被覆盖的位置,由于t=b,故该位置的值为 m = a ∗ b − a − b m=a*b-a-b m=a∗b−a−b ,它就是我们要求的最大m。
AC代码:
这么简单的代码,自己写。//忘开long long见祖宗