• poj1061 青蛙的约会


    记得以前就写过这道题,但死活wa......这几天重新看了一下exgcd,做了noip2012的d2t1和这道。

    exgcd用引用记录x,y的值。然后做poj1061的时候,发现仿佛ax=k(mod m) 这儿的a系数得是正的?如果a<0就把两边同乘-1,再用exgcd出x的特解求出特解x0之后一切都好办了,可以很方便求出最小非负整数解(x0%(m/gcd(a,m))+m/gcd(a,m))%(m/gcd(a,m))或者以m/gcd(a,m)为周期可以求出满足某些条件的解。(btw,ax+by=c同理,求出一个特解x0*(c/gcd)之后,可以求出同上的最小非负整数解,也可以b/gcd(a,b)为周期求出满足题目条件的解,通解为x=x0*(c/gcd)+(b/gcd)*k,k为任意整数)

    include<iostream>
    using namespace std;
    #define ll long long
    ll g,x,y,m,n,l,x0,p,q,c,a;
    ll exgcd(ll a,ll b, ll&x,ll&y)
    {
    	int t,g;
    	if (b==0){x=1;y=0;return a;}
    	g=exgcd(b,a%b,x,y);
    	t=x;x=y;y=t-(a/b)*y;
    	return g;
    }
    void solve()
    {
    	if (m==n) {cout<<"Impossible"<<endl;return;}
    	a=m-n;c=y-x;if (a<0){a=-a;c=-c;} // ap=c(mod l) a的系数要>0 
    	g=exgcd(a,l,p,q);
    	if (c%g!=0) {cout<<"Impossible"<<endl;return;}
    	x0=p*(c/g);
    	cout<<(x0%(l/g)+l/g)%(l/g)<<endl;
    }
    int main()
    {
    	cin>>x>>y>>m>>n>>l;
    	solve();
    	return 0;
    }
    

      

  • 相关阅读:
    第二周作业(软件需求分析与系统设计)
    自我介绍
    2019春总结作业
    2019春第十六周作业
    2019春第十五周作业
    2019春第十四周作业
    2019春第十二周作业
    2019春第十一周作业
    2019春第十周作业
    2019春第九周作业
  • 原文地址:https://www.cnblogs.com/edmunds/p/12290921.html
Copyright © 2020-2023  润新知