洛谷P3951 形象的题解

题目链接: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+2b 的整数)中的相应位置的 j 1 + b , j 2 + b , j 3 + b . . . j_1+b,j_2+b,j_3+b... j1+b,j2+b,j3+b...也是被覆盖的。从图中看更为直观:
P3951

图中红色部分为线段①就被覆盖的位置,可发现这些位置在线段②中的相应位置也是被覆盖的。而新增加的蓝色位置是由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+ta)%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 ta%b=0,因为a,b互质,故 t=b

所以可以发现在一个周期内,必然会经过区间内的所有点一次。(若某个点未被经过,且t=b,那么必然有个点经过了至少两次,而一个周期内不可能经过一个点两次)故可以看成在一个周期内,每次都会经过一个新的点,但是别忘了,一开始就经过的点还有b%b=0(区间上的),而0的下一个位置就是a(对应的 m = a + t ∗ a m=a+t*a m=a+ta),即b是周期内的最后一个点,所以我们只需找到0( m = t ∗ a m=t * a m=ta)的上一个位置( m = t ∗ a − a m=t*a-a m=taa)就是最后一个更新的点了。但是注意这个点并不是要求的最大m,因为该点(m=t*a-a)对应的区间是首个被完全覆盖的区间。它的上一个区间的对应位置( m = t ∗ a − a − b m=t*a-a-b m=taab)才是最后一个未被覆盖的位置,由于t=b,故该位置的值为 m = a ∗ b − a − b m=a*b-a-b m=abab ,它就是我们要求的最大m。

AC代码:

这么简单的代码,自己写。//忘开long long见祖宗
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值