成绩出来了,看起来是挺高的,但年级排名感觉还是没升.
感觉要好好学习了.
昨天定了一个目标,有点不切实际.(hehe)
这是我学Exgcd的第一题,记得以前打过。
学回来挺简单的。
if(c%d!=0)
{
printf("Impossible\n");
return ;
}
x=x*(c/d);
y=y*(c/d);
LL k=a*b/d;
x%=k;
while(x<0) x+=k/a;
printf("%I64d\n",x%L);
就这么几句东西,gcd不说了。
把x和y都变大,然后把x变成正数
不能用if,因为x有可能是一个负正数,k/a是一个绝对值比x还小的正整数,但k是非常大的正整数。
最后要x mod L,因为可以形象想成是原地踏步。
Code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#define LL long long
using namespace std;
LL X,Y,m,n,L;
LL a,b,c,d;
void Input()
{
scanf("%I64d%I64d%I64d%I64d%I64d",&X,&Y,&m,&n,&L);
a=(n-m); b=L; c=(X-Y);
}
LL x,y;
LL gcd(LL a,LL b)
{
LL t,dd;
if(b==0)
{
x=1;
y=0;
return a;
}
d=gcd(b,a%b);
t=x; x=y; y=t-(a/b)*y;
return d;
}
void Solve()
{
d=gcd(a,b);
if(c%d!=0)
{
printf("Impossible\n");
return ;
}
x=x*(c/d);
y=y*(c/d);
LL k=a*b/d;
x%=k;
while(x<0) x+=k/a;
printf("%I64d\n",x%L);
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
while(scanf("%I64d%I64d%I64d%I64d%I64d",&X,&Y,&m,&n,&L)!=EOF)
{
a=n-m; b=L; c=X-Y;
Solve();
}
return 0;
}