使用的方法是通过两个向量叠加看在某个方向上是否能只走一步,最后答案错误,无解输出成有解。
void solve(){
int n;
cin>>n;
vector<array<int,2>>a(n);
for(auto&[x,y]:a)cin>>x>>y;
//马在x,y方向上走
int sx=0,sy=0,gx=0,gy=0;
for(auto[x,y]:a)
{
if(x==0)
{
if(y<0)sy|=1;
else if(y>0)sy|=2;
gy=gcd(gy,abs(y));
}
else if(y==0)
{
if(x<0)sx|=1;
else if(x>0)sx|=2;
gx=gcd(gx,abs(x));
}
}
for(auto[x,y]:a)
{
for(auto[xx,yy]:a)
{
if(xx&&x)
{
int a=lcm(abs(xx),abs(x))/abs(xx),b=lcm(abs(xx),abs(x))/abs(x);
if((xx>0)==(x>0))b=-b;
int ny=a*yy+b*y;
if(ny<0)sy|=1;
else if(ny>0)sy|=2;
gy=gcd(gy,ny);
}
if(yy&&y)
{
int a=lcm(abs(yy),abs(y))/abs(yy),b=lcm(abs(yy),abs(y))/abs(y);
if((yy>0)==(y>0))b=-b;
int nx=a*xx+b*x;
if(nx<0)sx|=1;
else if(nx>0)sx|=2;
gx=gcd(gx,nx);
}
}
}
writeln(sx==3&&sy==3&&gx==1&&gy==1?"TAK":"NIE");
}