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; }
pain and happy in the cruel world.