[BalticOI 2024] Portal 题解
可将题意转化为:
注意到我们只关心传送门之间的相对位置,因此方便起见,不妨将某个传送门移动到原点,并移动其余传送门使各传送门之间的相对位置保持不变。将移动后的新坐标记为
不难发现,
这样,我们成功地将
时间复杂度为
#include<bits/stdc++.h>
using namespace std;
typedef __int128 ll;
ll n,x,y,dx,dy,fx,tx,ty;
inline ll read(){
ll s = 0,w = 1;
char ch = getchar();
while (ch > '9' || ch < '0'){ if (ch == '-') w = -1; ch = getchar();}
while (ch <= '9' && ch >= '0') s = (s << 1) + (s << 3) + (ch ^ 48),ch = getchar();
return s * w;
}
ll myabs(ll x){return x < 0 ? -x : x;}
void work(ll x,ll y){
if (y < 0) x = -x,y = -y;
while (ty){
ll qwq = y / ty;
x -= qwq * tx,y -= qwq * ty;
swap(x,tx),swap(y,ty);
}
fx = __gcd(fx,myabs(tx)),tx = x,ty = y;
}
int main(){
n = read();
for (ll i = 1;i <= n;i += 1){
if (i == 1){dx = read(),dy = read(); continue;}
x = read(),y = read(),work(x - dx,y - dy);
}
if (!fx || !ty) puts("-1");
else printf("%lld",(long long) (fx * myabs(ty)));
return 0;
}