• POJ 1061青蛙的约会


    Problem

    http://poj.org/problem?id=1061

    Solution

    题外话:右边是西啊。。。
    本题是扩欧的必修题,就打打看了看。
    我们设跳了k次碰面。
    可得(x+km)(y+kn)=Lpp(x+k*m)-(y+k*n)=L*p(p为整数)
    我们将其化简,可得:
    (nm)k+Lp=xy(n-m)*k+L*p=x-y
    其中,a=nm,b=L,c=xya=n-m,b=L,c=x-y
    哈哈,这不就是扩欧嘛!
    ax1+by1=ca*x1+b*y1=c
    咚咚打完,输出x1(c/gcd)x1*(c/gcd)
    结果WA了。
    后来发现该答案好像不是最优解。
    我们可以发现:
    如果答案k>Lk>L的话,我们便可以将kLk-L,然后将p+(nm)p+(n-m)
    如果答案k<0k<0的话,反之。
    这样,求得的答案才会是最优解了。

    Code

    #include<cstdio>
    #define ll long long
    using namespace std;
    ll x,y,m,n,L,x1,y1;
    ll a,b,c,gcd;
    
    void exgcd(ll x,ll y,ll &x1,ll &y1)
    {
    	if (!y) {gcd=x,x1=1,y1=0; return;}
    	exgcd(y,x%y,y1,x1),y1-=x1*(x/y);
    }
    
    int main()
    {
    	freopen("frog.in","r",stdin);
    	freopen("frog.out","w",stdout);
    	scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&L);
    	a=n-m,b=L,c=x-y;
    	exgcd(a,b,x1,y1);
    	if (c%gcd) {puts("Impossible"); return 0;}
    	x1=x1*c/gcd,y1=y1*c/gcd;
    	printf("%lld
    ",(x1%b+b)%b);
    	return 0;
    }
    
    转载需注明出处。
  • 相关阅读:
    HDU 1856 More is better
    并查集模板
    HDU 1325 Is It A Tree?
    HDU 1272 小希的迷宫
    CodeVS 2639 约会计划
    POJ 1163 数字三角形
    HDU 1232 畅通工程
    HDU 1213 How Many Tables
    树形结构打印二叉树
    网址收藏
  • 原文地址:https://www.cnblogs.com/jz929/p/11817530.html
Copyright © 2020-2023  润新知