(P1052 [NOIP2005 提高组])过河(动态规划+裴蜀定理)

本文介绍了如何使用裴蜀定理优化动态规划算法,解决在大量数据下过河问题,通过减少计算次数避免超时。文章详细分析了当步长为s和s+1时,如何确保能到达所有位置,并提供了C++代码实现。

题目链接:[NOIP2005 提高组] 过河 - 洛谷

分析:其实很容易想到的就是设f[i]表示跳到坐标为i的位置时所踩到的最少石子数,那么显然有

f[i]=min(f[i-T~i-S])+vis[i],其中vis[i]标记坐标为i的位置是否有石子,但是当我们读完数据范围后发现这样是不行的,因为数据范围是1e9,显然会超时,但是发现石子数量不是很多,所以这个时候我们就需要从石子之间的距离这个角度来对本道题目来进行优化了。

假设我们每次可以走s~t步,如果s==t,那么我们只有一种走的方式,那么这样答案就很容易求出来,现在我们来分析一下s!=t的情况,那么我们每步可以走s步也可以走s+1,步,那么对于任意的w>=(s+1)*s,我们都可以通过每次走s或s+1步来到达,这个是由裴蜀定理推论得到的。

先来说一下裴蜀定理:对于任意的x和y都能够找到a和b使得a*x+b*y=gcd(x,y)成立

那么一定有k*a*x+k*b*y=k*gcd(x,y)成立

由于s和s+1互质(任意相邻两个数均互质),一定有a*s+b*(s+1)=w(w>=s*(s+1))成立,现在的问题就是我们能不能找到正整数解满足这个等式我们假设0<=a<=s,那么b=(w-a*s)/(s+1)>=0,所以一定存在正整数a和b满足上面方程,那也就是说任

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值