每一道中文题,都不是!天!下!掉!馅饼!!
这是一道数论题,我现在在写他的时候也还是极晕的。。
题目:
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。
还见到了原来的同学还是小学的。
生而不同,谁都回不到过去【除了万年不变的我嗯】。
【说的跟早就看透了一样骗谁呢。】
还有今天牙疼,还是吃了很多彩虹糖。不知道为什么就是很想吃。
突然想起来一个古龙的段子:
喝酒真的能使你忘掉很多事情吗? –不能。
喝完酒后很舒服吗?–不会。
那为什么还是要喝?–我也不知道。
我也不知道。
今天莫名像皮蛋学习了一发,其实我也不知道到底想说啥。
明天就走了呢。