|BZOJ 1477|扩展欧几里得算法|青蛙的约会

来源:互联网 发布:光大证券mac版下载 编辑:程序博客网 时间:2024/05/16 01:47

BZOJ传送门
luogu免权限地址
扩展欧几里得算法,由题可列(x+mt)(y+nt)(modL),其中t为所求
由同余性质得:(x+mt)(y+nt)=Lk
变形得:(nm)t+lk=xy,则转换为ax+by=c的形式

#include<cstdio>    #include<algorithm>    #include<cstring>      #define ms(i,j) memset(i,j, sizeof i);    #define ll long longusing namespace std;ll x,y,m,n,L; ll gcd(ll a, ll b) {return b==0 ? a:gcd(b,a%b);}ll abss(int x){return x<0 ? -x : x;}ll e_gcd(ll a, ll b, ll &x, ll &y){    if (b==0)    {        x=1;        y=0;        return a;    }    ll ans = e_gcd(b,a%b,x,y);    ll temp = x;    x = y;    y = temp-a/b*y;    return ans;}ll cal(){    ll a = n-m, b = L, c = x-y;    ll g = gcd(a,b);    if (c%g!=0) {printf("Impossible");exit(0);}//无解    a /= g; b /= g; c /= g;    e_gcd(a,b,x,y);    b = abss(b);//重要     x=((x*c)%b+b)%b; //求值     return x;}int main()    {         scanf("%lld%lld%lld%lld%lld", &x,&y,&m,&n,&L);    ll ans = cal();     printf("%lld\n", ans);    return 0;    }    
0 0
原创粉丝点击