成績出來了,看起來是挺高的,但年級排名感覺還是沒升.
感覺要好好學習了.
昨天定了一個目標,有點不切實際.(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;
}