青蛙兔子的约会

这篇具有很好参考价值的文章主要介绍了青蛙兔子的约会。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

青蛙兔子的约会

题目描述

每当晚上时,青蛙都会出来活动,白天休息。白天时,兔子就会出来活动,晚上休息。
青蛙一次可以跳 a a a 米,兔子一次可以跳 b b b 米,已知青蛙在坐标 0 0 0 的位置,兔子在坐标 n n n 的位置。

现在青蛙与兔子在明天白天有个约会,但是青蛙不想等太久兔子,他决定在今天夜晚时就开始行动。
但是青蛙又怕累,所以晚上时青蛙只会向兔子的方向跳 [ L , R ] [L, R] [L,R] 次。
问青蛙能否与兔子约会?

输入描述:

输入共 T + 1 T+1 T+1 行。

第一行一个整数表示 T ( 1 ≤ T ≤ 1 0 5 ) T(1 \leq T \leq 10^5) T(1T105)

接下来 T T T 行,每行 5 5 5 个整数表示 a , b , n , L , R ( 1 ≤ a , b , n , L , R ≤ 1 0 9 , L ≤ R ) a,b,n,L,R(1 \leq a,b,n,L,R \leq 10^9, L≤R) a,b,n,L,R(1a,b,n,L,R109,LR)

数据保证青蛙不会跳过 n n n 的位置,即 1 ≤ L a ≤ R a ≤ n 1 \leq La \leq Ra \leq n 1LaRan

输出描述:

输出共 T T T 行,每行一个"YES" 或 “NO”(不包括双引号),表示青蛙和兔子能否约会。

示例1

输入
3
3 4 10 1 2
2 4 5 1 1
3 5 11 1 1
输出
YES
NO
NO

说明

第一问,青蛙晚上向右跳 1 1 1 次,白天无法与兔子相遇。青蛙向右跳 2 2 2 次,也就是 2 a = 6 2a=6 2a=6 的距离,白天兔子向左跳 1 1 1 次,可以相遇。所以在跳 [ 1 , 2 ] [1,2] [1,2] 次中,存在青蛙和兔子可以相遇。
第二问,青蛙晚上向右跳 1 1 1 次,然后无论白天兔子怎么跳,都无法和青蛙相遇。

题解

1 判断是否有整数解

该题目可以等价为:求解一个二元一次方程组的整数解。
即求解: a x + b y = n ax + by = n ax+by=n 的正整数解,且 x ∈ [ L , R ] x \in [L, R] x[L,R]
首先使用 裴蜀定理 来判断 a x + b y = n ax + by = n ax+by=n 是否有整数解。
判断过程为:

  1. ( a , b ) (a, b) (a,b) 的最大公约数 d d d
  2. 判断 d d d 是否能整除 n n n
  3. 若能整除则有整数解,若不能则没有整数解。

2 求通解 = 特解+其次解

a x + b y = n ax + by = n ax+by=n 有整数解,且 d = g c d ( a , b ) d = gcd(a, b) d=gcd(a,b)
那么我们求该方程组的通解,并判断通解集合和 [ L , R ] [L, R] [L,R]是否有交集。有交集则有能约会,没有则不能约会。

我们使用扩展欧几里得算法求出 a x + b y = d ax + by = d ax+by=d 的一组特解: ( x 0 , y 0 ) (x_0, y_0) (x0,y0)
由此得出 a x + b y = n ax + by = n ax+by=n 的一组特解: ( x 0 ∗ n d , y 0 ∗ n d ) (x_0*\frac{n}{d}, y_0*\frac{n}{d}) (x0dn,y0dn)

方程 a x + b y = 0 ax + by = 0 ax+by=0 的通解为: ( k ∗ b d , k ∗ a d ) , k ∈ Z (k*\frac{b}{d}, k*\frac{a}{d}), k \in \mathbb{Z} (kdb,kda),kZ

综上: a x + b y = n ax + by = n ax+by=n 的特解为: ( x 0 ∗ n d + k ∗ b d , y 0 ∗ n d + k ∗ a d ) , k ∈ Z (x_0*\frac{n}{d}+k*\frac{b}{d}, y_0*\frac{n}{d}+k*\frac{a}{d}), k \in \mathbb{Z} (x0dn+kdb,y0dn+kda),kZ

随后判断 { x ∣ x = x 0 ∗ n d + k ∗ b d , k ∈ Z } \{x|x = x_0*\frac{n}{d}+k*\frac{b}{d}, k \in \mathbb{Z}\} {xx=x0dn+kdb,kZ} [ L , R ] [L, R] [L,R] 是否有交集即可。详情看代码!文章来源地址https://www.toymoban.com/news/detail-443460.html

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;


ll exgcd(ll a, ll b, ll &x, ll &y){
    if (b == 0ll){
        x = 1ll, y = 0ll;
        return a;
    }

    ll d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}


int main(){
    int t;cin>>t;
    while(t--){
        ll a, b, n, d, l, r, x0=0, y0=0;
        scanf("%lld%lld%lld%lld%lld", &a, &b, &n, &l, &r);
        d = exgcd(a, b, x0, y0);  // d = gcd(a, b), (x0, y0)是 ax+by = d 的特解
        if(n % d != 0){  // 没有整数解
            cout<<"NO\n";
        }
        else{ // 有整数解
            b = b/d;
            ll x1 = x0*n/d; // ax+by=n 的特解
            // 通解为  x = x1 + k*b
            ll x = (x1 + b) % b; // 最小特解
            x = x + l/b*b; // 接近 l 的解
            while(x<l) x += b; // 找到第一个大于l的特解x
            if(x <= r){  // 判断 第一个大于l的解x 是否小于等于 r
                cout<<"YES\n";
            }
            else{
                cout<<"NO\n";
            }
        }
    }

    return 0;
}

到了这里,关于青蛙兔子的约会的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 约会怎么走到目的地最近呢?一文讲清所有最短路算法问题

          🚀🚀🚀🚀🚀订阅专栏👉 趣学算法(dog) 👈 带你学习 算法原理 + 算法模板 🚀🚀🚀🚀🚀 朋友们好啊,好久没写过优质博客和算法博客了,所以今天打算把我最近学习的算法— 最短路算法 给大家讲一讲,我们将 由浅入深地去讲解 ,以 “初学者” 的角度去

    2024年02月09日
    浏览(34)
  • Web浪漫历程:揭秘二十年间与您“约会”的浏览器发展

    🧑‍💼 个人简介:一个不甘平庸的平凡人🍬 🖥️ Node专栏:Node.js从入门到精通 🖥️ TS知识总结:十万字TS知识点总结 👉 你的一键三连是我更新的最大动力❤️! 📢 欢迎私信博主加入前端交流群🌹 哈喽,大家好啊!👋 因为自身的原因已经好久没发文了,不知道大家

    2024年02月15日
    浏览(29)
  • 青蛙跳台阶问题

    题目:青蛙上楼需要走n个台阶,一次可以跳1个或2个台阶,那它一共有多少中走法 本题运用的递归的写法,由分析可知,青蛙一次只能走1或2个台阶,且有且仅有1中走法,n=2时,有两种走法,假设n=10,则走法共有在当前基础上进行的n-1+n-2种走法相加

    2024年02月12日
    浏览(29)
  • 动态规划--青蛙跳台阶

    斐波那契数列每次学都有不一样的体会,从最开始简单理解就是,一个找规律的游戏,就是更新数值,往后算就行了,但是,后来,用斐波那契数列理解递归算法,是一个很好的例子,由上向下计算,依次回溯,最后,没想到斐波那契数列还能和动态规划联系起来。当然,斐

    2024年02月19日
    浏览(21)
  • C语言 青蛙跳台阶问题

    目录 ​编辑 1.问题描述 2.问题分析 3.全部代码 4.结语 一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶有多少种跳法? 当台阶只有一级时,只能跳一级,所以只有一种跳法 当台阶有两级时,可以先跳一级,再跳一级,或者直接跳两级 所以有两

    2024年03月28日
    浏览(32)
  • 【青蛙跳台阶问题 —— (三种算法)】

    一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:2 示例 2: 输入:n = 7 输出:21 示例 3: 输入:n = 0 输出:1 提示:

    2024年02月05日
    浏览(27)
  • XTU-OJ 1343-青蛙

    有n个位置按顺时钟排列成一个圆,分别编号从1∼n。一只青蛙最开始在1号位置上,它每次可以跳往与之相隔k个位置的位置上。比如,n=5,k=2时, 青蛙从位置1可以按逆时钟方向跳到位置3,也可以按顺时钟方向跳到位置4。请问这只青蛙能跳到所有的位置上吗? 第一行输入一个

    2024年02月07日
    浏览(27)
  • 【动态规划】C++算法:403.青蛙过河

    视频算法专题 动态规划汇总 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。 给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过

    2024年01月17日
    浏览(33)
  • 【Leetcode每日一题】模拟 - 数青蛙(难度⭐⭐)(54)

    1. 题目解析 题目链接:1419. 数青蛙 这个问题的理解其实相当简单,只需看一下示例,基本就能明白其含义了。 2.算法原理 一、模拟青蛙叫声的基本逻辑 在模拟青蛙叫声的过程中,我们需要遵循一定的规则来判断何时青蛙会发出声音。具体规则如下: 当遇到字符序列 \\\'r\\\'、

    2024年04月11日
    浏览(26)
  • Python动态规划——以“codeJan与青蛙”为例

    链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网         codeJan喜欢观察世界。有一天,codeJan发现一个非常奇怪的现象。有一些年轻的青蛙聚集在一条直线上的某些位置上,同一个位置可能有多个青蛙。这些青蛙每次只会向前跳一米,并且每只青蛙每跳一次都

    2024年02月02日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包