bzoj1477: 青蛙的约会

exgcd的题。(给我留下巨大心理阴影的gcd啊,你又断了我的连A纪录。。)

就是推柿子

(av-bv)*x-(L*y+(bp-ap+L)%L)=0

(av-bv)*x-L*y=(bp-ap+L)%L

然后就gcd。

有个神奇的问题,B不能是负的?我把B=-L改成L就过了?

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;

LL exgcd(LL a,LL b,LL &x,LL &y)
{
    if(a==0)
    {
        x=0;y=1;
        return b;
    }
    else
    {
        LL tx,ty;
        LL d=exgcd(b%a,a,tx,ty);
        x=ty-b/a*tx;
        y=tx;
        return d;
    }
}

int main()
{
    LL ap,bp,av,bv,L;
    scanf("%lld%lld%lld%lld%lld",&ap,&bp,&av,&bv,&L);
    if(av<bv){swap(ap,bp);swap(av,bv);}
    
    LL A=av-bv;
    LL B=L;
    LL K=(bp-ap+L)%L;
    
    LL x,y;
    LL d=exgcd(A,B,x,y);
    
    if(K%d!=0)printf("Impossible\n");
    else 
    {
        LL X=x*(K/d);
        X=(X%(B/d)+B/d)%(B/d);
        printf("%lld\n",X);
    }
    return 0;
}
posted @ 2018-02-07 10:49  AKCqhzdy  阅读(148)  评论(0编辑  收藏  举报