ABC193E
题目大意
题目传送门
多组数据。一个人坐公交从
题目分析
令公交车往返两地
经整理得:
于是我们想到扩欧。
先解方程
令
枚举
AC代码
#include<bits/stdc++.h>
using namespace std;
bool flag;
long long t,x,y,p,q,d,a,b,minn=0x7fffffffffffffff;
long long ans;
void Exgcd(long long a,long long b,long long &x,long long &y)
{
if(!b)
{
d=a,x=1,y=0;
return;
}
Exgcd(b,a%b,x,y);
long long tx=x;
x=y;
y=tx-a/b*y;
}
int main()
{
cin>>t;
for(int t1=1;t1<=t;t1++)
{
cin>>x>>y>>p>>q;
minn=0x7fffffffffffffff;
flag=0;
Exgcd(2*(x+y),p+q,a,b);
for(long long i=x;i<x+y;i++)
{
for(long long j=p;j<p+q;j++)
{
if((j-i)%d!=0)continue;
flag=1;
long long k=(j-i)/d;
long long aa=a*k;
aa=(aa%((p+q)/d)+((p+q)/d))%((p+q)/d);
minn=min(minn,aa*2*(x+y)+i);
}
}
if(!flag)cout<<"infinity";
else cout<<minn;
cout<<'\n';
}
return 0;
}
别慌,还有优化
我们可以直接枚举
代码:
#include<bits/stdc++.h>
using namespace std;
bool flag;
long long t,x,p,d,a,b,minn=0x7fffffffffffffff;
int y,q;
long long ans;
void Exgcd(long long a,long long b,long long &x,long long &y)
{
if(!b)
{
d=a,x=1,y=0;
return;
}
Exgcd(b,a%b,x,y);
long long tx=x;
x=y;
y=tx-a/b*y;
}
int main()
{
cin>>t;
for(int t1=1;t1<=t;t1++)
{
cin>>x>>y>>p>>q;
minn=0x7fffffffffffffff;
flag=0;
Exgcd(2*(x+y),p+q,a,b);
for(long long i=p-(x+y-1);i<=p+q-1-x;i++)
{
if(i%d!=0)continue;
flag=1;
long long k=i/d;
long long aa=a*k;
aa=(aa%((p+q)/d)+((p+q)/d))%((p+q)/d);
if(i>=p-x)minn=min(minn,aa*2*(x+y)+x);
else minn=min(minn,aa*2*(x+y)+x+(p-x-i));
}
if(!flag)cout<<"infinity";
else cout<<minn;
cout<<'\n';
}
return 0;
}