Luogu_P1516【题解】青蛙的约会 exgcd

题目链接:https://www.luogu.org/problem/P1516

由题目可以得出:

  x+k*m=y+k*n(mod l)

将mod l放入公式:

  (x-y)=(n-m)*k+l*t

设n-m为w 设x-y为c

  k*w + l*t = c

那么就可以用exgcd来求解了。

先解出

  k*w + l*t = d = gcd(w,l) 

然后把答案乘 c/d 就可以求出了。

但是还不是最优解,有一个神仙公式,也就是代码统计答案的最后一行。

取个模。

代码如下:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll X,Y,m,n,l,x,y;
ll exgcd(ll a,ll b,ll &x,ll &y){
    if(!b){
        x=1;y=0;
        return a;
    }
    ll ans=exgcd(b,a%b,x,y);
    ll z=x;
    x=y;
    y=z-y*(a/b);
    return ans;
}
int main()
{
    scanf("%lld%lld%lld%lld%lld",&X,&Y,&m,&n,&l);
    ll k=n-m,s=X-Y;
    if(k<0){
        k=-k;s=-s;
    }
    ll ans=exgcd(k,l,x,y);
    if(s%ans!=0) printf("Impossible\n");
    else printf("%lld\n",(x*(s/ans)%(l/ans)+(l/ans))%(l/ans));
    //system("pause");
    return 0;
}

原文地址:https://www.cnblogs.com/ChrisKKK/p/11442378.html

时间: 2024-10-18 08:35:32

Luogu_P1516【题解】青蛙的约会 exgcd的相关文章

POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]

先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/6804137.html) 定理2: 一元线性同余方程ax ≡ n (mod b) 有解,当且仅当gcd(a,b)|n. 也就是说,解出了ax+by=gcd(a,b),就相当于解出了ax≡n(mod b) (而且只要满足gcd(a,b)|n,就一定有解) 定理3: 若gcd(a,b) = 1,则方程ax

POJ1061 青蛙的约会 exgcd

这个题虽然很简单,但是有一个比较坑的地方,就是gcd不一定是1,有可能是别的数.所以不能return 1,而是return a; 题干: Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到

题解 P1516 【青蛙的约会】

题目链接 Solution 青蛙的约会 题目大意:求解不定方程\(ax+by=c\) 分析:我们可以把原来的同余式子写成一个不定方程,这部分基本操作不讲,主要讲方程求解.看到不定方程我们就想到\(exgcd\)对吧? 但是\(exgcd\)只能适用于求解\(ax+by=g\),其中\(g=gcd(a,b)\)的情况 我们设\(exgcd\)求出的一组特解是\((x_0,y_0)\),显然对于方程\(ax+by=c\)的一组解就是\((x_oc/g,y_0c/g)\)对吧?如果\(g \nmid

解题报告 之 POJ1061 青蛙的约会

解题报告 之 POJ1061 青蛙的约会 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙

POJ - 1061 青蛙的约会 (扩展欧几里得算法)

Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面. 我们把这

POJ1061——青蛙的约会(扩展欧几里德)

青蛙的约会 Description两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总能碰到对方的.但是除非这两只青蛙在同一时间跳到同一点上,不然是永远都不可能碰面的.为了帮助这两只乐观的青蛙,你被要求写一个程序来判断这两只青蛙是否能够碰面,会在什么时候碰面.

bzoj1477 青蛙的约会

1477: 青蛙的约会 Time Limit: 2 Sec  Memory Limit: 64 MBSubmit: 712  Solved: 416[Submit][Status][Discuss] Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某

青蛙的约会(POJ 1061 同余方程)

青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 103802   Accepted: 20198 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,总

青蛙的约会(poj1061+欧几里德+同余方程)

** 青蛙的约会 ** Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 94174 Accepted: 17412 Description 两只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们很高兴地发现它们住在同一条纬度线上,于是它们约定各自朝西跳,直到碰面为止.可是它们出发之前忘记了一件很重要的事情,既没有问清楚对方的特征,也没有约定见面的具体位置.不过青蛙们都是很乐观的,它们觉得只要一直朝着某个方向跳下去,