当前位置: 首页 > news >正文

【2024.9.28练习】青蛙的约会

题目描述


题目分析

        由于两只青蛙都在跳跃导致变量多,不妨采用物理题中的相对运动思想,设青蛙A不动,青蛙B每次跳n-m米,两只青蛙的距离为x-y米。正常来说,只要模拟青蛙B与青蛙A的相对运动过程,最终当青蛙B与青蛙A距离为0时即可求得总跳跃次数。但是难点在于数据量大,按部就班的模拟将会超时。

        由于这是一道有关整数和环的数学题,考虑使用扩展欧几里得算法求解。现直接假设一只青蛙静止,另一只青蛙每次位移为a=n-m,总跳跃次数为X,一圈长度为b=L,跳跃的圈数为Y,青蛙间的距离为c=x-y。则题目满足方程:aX+bY=c。显然要使方程有整数解,必须满足的条件是:c必须是 a 和 b 的最大公约数的倍数,即ax\equiv c(mod\ b)。这可以通过贝祖定理证明。

        接下来的难点是求出最小跳跃次数。根据拓展欧几里得算法已经得到了方程的一组特解,但这不一定是最优解,根据线性同余方程的通解公式:

x=x_0+k\frac{b}{d}\mid k\in \mathbb{Z},d=gcd(a,b)

只需让该特解模除\frac{b}{d}即可求出跳跃次数在(0,\frac{b}{d}]间的最小正整数解。

        提交后有一处测试点有误,经检查,原来在exgcd算法中,如果两个参数存在负数,输出的最大公因数gcd(a,b)也可能是负数。这并不影响所得特解的正确性,但在求最小正解的时候,需要采取措施让取模后的结果转变为正数。


我的代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;// 扩展欧几里得算法
ll extgcd(ll a, ll b, ll& x, ll& y) {if (b == 0) {x = 1;y = 0;return a;}ll d = extgcd(b, a % b, y, x);y -= (a / b) * x;return d;
}int main() {ll x, y, m, n, L;cin >> x >> y >> m >> n >> L;ll a = n - m;  // 移项后得到 a = n - mll b = x - y;  // 常数项 b = x - yll l = L;      // 模数为 Lll x0, y0;ll d = extgcd(a, l, x0, y0);  // 使用扩展欧几里得求解if (b % d != 0) {cout << "Impossible" << endl;}else {// 存在解的情况,求最小非负整数解ll k = (x0 * (b / d)) % (l / d); //其中x0*(b/d)为一个方程的特解if (k < 0) {if (l / d > 0) {k += l / d;  // 保证 k 为非负}else {k -= l / d;  // 保证 k 为非负}}cout << k << endl;}return 0;
}

由于扩展欧几里得算法参数使用了引用,导致逻辑相对更难理解,我利用原本欧几里得算法的数学递推逻辑修改为一下函数,程序可以成功运行:

ll x_0;
ll y_0;
ll x_1;
ll y_1;
ll extgcd(ll a, ll b) {ll d = a;if (b != 0) {d = extgcd(b, a % b);x_0 = y_1;y_0 = x_1 - a / b * y_1;y_1 = y_0;x_1 = x_0;}else {x_1 = 1;y_1 = 0;}return d;
}

http://www.lryc.cn/news/448561.html

相关文章:

  • Python入门:类的异步资源管理与回收( __del__ 方法中如何调用异步函数)
  • Android开发中的ViewModel
  • Vue 3 文件编译流程详解与 Babel 的使用
  • Android常用C++特性之std::chrono
  • [Oracle] ORA-04036: 实例使用的 PGA 内存超出 PGA_AGGREGATE_LIMIT
  • 一次 Spring 扫描 @Component 注解修饰的类坑
  • 深度学习:调整学习率
  • Java项目实战II基于Java+Spring Boot+MySQL的厨艺交流平台设计与实现(源码+数据库+文档)
  • 第二十节:学习Redis缓存数据库实现增删改查(自学Spring boot 3.x的第五天)
  • Android SQLite的基本使用、生成Excel文件保存到本地
  • 记一次因视频编码无法在浏览器播放、编码视频报错问题
  • 【深度学习】深度卷积神经网络(AlexNet)
  • C语言扫盲
  • 视频融合共享平台LntonAIServer视频智能分析抖动检测算法和过亮过暗检测算法
  • 【笔记篇】Davinci Configurator OS模块(上)
  • 19.3 打镜像部署到k8s中,prometheus配置采集并在grafana看图
  • 如何让系统u盘重新可用
  • 14.安卓逆向-frida基础-编写hook脚本2
  • 车辆零部件检测和分割数据集-车体数据集-yolo格式-yolov5-yolov10可用
  • 甄选范文“论分布式存储系统架构设计”,软考高级论文,系统架构设计师论文
  • 第十四章:html和css做一个心在跳动,为你而动的表白动画
  • poetry安装
  • Proteus如何添加数码管
  • 5 apache poi实现excel的动态下拉框功能
  • 深度对比:etcd、Consul、Zookeeper 和 Nacos 作为注册中心和配置中心的优势与劣势
  • Android webview拦截H5的接口请求并返回处理好的数据
  • vue echarts tooltip使用动态模板
  • 網路本地連接沒有有效的IP配置:原因與解決方法
  • 如何使用ssm实现基于web的学生就业管理系统的设计与实现+vue
  • TCP三次握手四次挥手详解