poj 1061 青蛙的约会

每一道中文题,都不是!天!下!掉!馅饼!!

这是一道数论题,我现在在写他的时候也还是极晕的。。

题目:
poj 1061

题意:
略。

分析:
看到这道题,想到的是数学问题:
很容易可以列出个关系式:
(x+m*T)-(y+n*T)=p*l【其中T是答案,p是任意整数代表几圈】】
化简一下:
x-y=p*l+(n-m)*T;
woc一看这个式子我激动啊,这不就是那个,就是内个
ax+by=c;吗。不是内个【【扩展欧几里得吗!!】】

然后我就懵逼了。woc这数据范围,woc这玩意怎么求!!

然后让我们来吃个饭,之后慢慢分析一下。

首先:
扩展欧几里得:对于两个不全为0的整数a、b,必存在一组解x,y,使得ax+by==gcd(a,b);//借这个式子求出两个基本解,x0,y0,但还不能保证是不是正确答案!【【需要说明的是原题中的C可不一定是最大公约数哦。没准乘过k;
但是
同理:
若是c=k*gcd(a,b);
则有 axk+byk=c;
x1=x*k; y1=y*k;

我们可以由此得到x,y的通式:
x=x0*b/d;y=y0*b/d【【可以自己证明一下】】【【类比原式】】

然后就要求扩展欧几里得的gcd:
b*x+a%b*y=d;2)
变形:b*x+a*y-(a/b)*b*y=d;
再变:a*y+b(x-a/b*y)=d; 3)
与2)式比较:
得:
当a=b;b=a%b时:x=y;y=x-a/b*y;
调用过程中的x,y就是对应的a,b的解;
当回到顶层时,a,b就是最初的a,b所以此时的x,y就是所求解;

剩下的就是求最小值,这就很好说了;

#include<cstdio>
#include<algorithm>
#include<cstring>
#define LL long long
//by mars_ch 
using namespace std;
LL x,y,m,n,l,a,b,c,d,X,Y;
LL gcd(LL w,LL z)
{
    LL p,q;
    if(z == 0)
    {
        x=1;
        y=0;
        return w;
    }
    q=gcd(z,w%z);
    p=x;
    x=y;
    y=p-(w/z)*y;
    return q;
}
int main()
{
    scanf("%lld%lld%lld%lld%lld",&X,&Y,&m,&n,&l);
    a=n-m;
    b=l;
    c=X-Y;
    d=gcd(a,b);
    if(c%d !=0)
    {
        printf("Impossible\n");
    }
    else{
        x=x*(c/d);
        y=y*(c/d);
        LL ans=x*d/b; // x/(b/d)  整形出发 
        ans=x-ans*b/d;
        if(ans<0)            //可能是负数,不加样例就是-1,所以这样例给的还是很尽职尽责的。 
        {
            ans+=b/d;
        }
        printf("%lld\n",ans);
    }
} 

剩下的是废话。看题解的同学可以点击右上角的叉了。
Dairy
倒数第二天,今天吃到了菠萝饭,虽然没有菠萝里脊饭那么好吃但也算圆了一会梦。【回去我要投诉本部食堂那是个鬼啊!!】】

越发发现秦神萌萌哒了~~
但他讲的东西一点也不萌【【= =】】,这只是很多幻灯片中的一页我写了这么久。。

刚刚把杯子【一满杯的水】碰倒了,woccccc。

还见到了原来的同学还是小学的。

生而不同,谁都回不到过去【除了万年不变的我嗯】。

【说的跟早就看透了一样骗谁呢。】

还有今天牙疼,还是吃了很多彩虹糖。不知道为什么就是很想吃。

突然想起来一个古龙的段子:
喝酒真的能使你忘掉很多事情吗? –不能。
喝完酒后很舒服吗?–不会。
那为什么还是要喝?–我也不知道。

我也不知道。

今天莫名像皮蛋学习了一发,其实我也不知道到底想说啥。

明天就走了呢。

你可能感兴趣的:(poj)