码迷,mamicode.com
首页 > 其他好文 > 详细

洛谷 P1516 青蛙的约会(中国剩余定理CRT)

时间:2018-03-08 22:07:12      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:tps   long   blank   最小   a*   complex   www.   bsp   problem   

题目描述

 

两青蛙会相遇的条件[(x-y)+k(m-n)]%l=0
令a=m-n,b=l,c=x-y,所以(c+k*a)%b=0 -> aX+bY=c
方程有解,当且仅当c%Gcd(a,b)=0
令r=Gcd(a,b)
为什么(X*(c/r)%(b/r)+b/r)%(b/r)为最小解?
目标解aX+bY==c
有解的条件是c%r=0,也就是c=K*r
那么就办成了aX+bY=K*r
那么也就是解a*(X/K)+b(Y/K)=r
然后扩展欧几里得定理就是解a*X+b*Y=r
那么解出来X之后X就要乘上K也就是要乘上c/r
设Z=c/r,为了防止负数输出

#include<complex>
#include<cstdio>
using namespace std;
long long X,Y,l,x,y,m,n;
long long Exgcd(long long a,long long b,long long &x,long long &y)
{
    if(!b)
    {
        x=1;y=0;
        return a;
    }
    int r=Exgcd(b,a%b,x,y),tmp=x;
    x=y;y=tmp-a/b*y;
    return r;
}
int main()
{
    scanf("%d%d%d%d%d",&x,&y,&m,&n,&l);
    int a=n-m,b=l,c=x-y;
    if(a<0)
    {
        a=-a;
        c=-c;
    }
    long long r=Exgcd(a,b,X,Y);
    if(c%r)printf("Impossible\n");
    else printf("%lld\n",(X*(c/r)%(b/r)+b/r)%(b/r));
    return 0;
}

 

洛谷 P1516 青蛙的约会(中国剩余定理CRT)

标签:tps   long   blank   最小   a*   complex   www.   bsp   problem   

原文地址:https://www.cnblogs.com/LeTri/p/8531049.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!