제출 #1166410

#제출 시각아이디문제언어결과실행 시간메모리
1166410Math4Life2020Portal (BOI24_portal)C++20
11 / 100
32 ms4832 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = __int128; using pii = pair<ll,ll>;

ll gcd2(ll a, ll b) {
    if (a==0 || b==0) {
        return max(labs(a),labs(b));
    }
    return gcd(labs(a),labs(b));
}

ll cpr(pii p1, pii p2) {
    return (p1.first*p2.second-p2.first*p1.second);
}

inline ll fmod(ll x, ll MOD) {
    return (x+MOD*(2-x/MOD))%MOD;
}

inline pii fmod(pii p0, ll MOD) {
    return {fmod(p0.first,MOD),fmod(p0.second,MOD)};
}

ll inv(ll x, ll MOD) {
    assert(MOD!=0);
    if (MOD<0) {
        MOD=-MOD;
    }
    x = fmod(x,MOD);
    array<ll,3> a = {x,1,0};
    array<ll,3> b = {MOD,0,1};
    while (b[0]!=1) {
        if (a[0]>b[0]) {
            swap(a,b);
        } else {
            ll k = b[0]/a[0];
            for (ll i=0;i<3;i++) {
                b[i]-=k*a[i];
            }
        }
    }
    return fmod(b[1],MOD);
}

pii fix(pii p1, pii p2) { //assuming cpr = 0, adjust both
    assert(cpr(p1,p2)==0);
    if (p1.first==0 && p1.second==0) {
        return p2;
    }
    if (p2.first==0 && p2.second==0) {
        return p1;
    }
    if (p1.first==0 && p2.first==0) {
        return {0LL,gcd2(p1.second,p2.second)};
    }
    if (p1.second==0 && p2.second==0) {
        return {gcd2(p1.first,p2.first),0LL};
    }
    ll a = gcd2(p1.first,p2.first);
    return {a,(p1.second*a)/p1.first};
}

ll ans = 0;
ll nvec = 0;
pii p0,p1;

void flip() {
    if (nvec==2) {
        swap(p0,p1);
    }
}

void anl() {
    if (ans==-1) {
        if (nvec==2) {
            if (cpr(p1,p0)==0) {
                p1 = fix(p1,p0);
                nvec=1;
            }
        }
        return;
    }
    if (nvec==0) {
        return;
    }
    if (nvec==1) {
        p0 = fmod(p0,ans);
        if (p0.first==0 && p0.second==0) {
            nvec = 0;
        }
        return;
    }
    if (nvec==2) {
        p0 = fmod(p0,ans);
        if (p0.first==0 && p0.second==0) {
            nvec = 1;
            swap(p0,p1);
            anl();
            return;
        }
        p1 = fmod(p1,ans);
        if (p1.first==0 && p1.second==0) {
            nvec = 1;
            anl();
            return;
        }
        if (cpr(p1,p0)==0) {
            p1 = fix(p1,p0);
            nvec = 1;
            anl();
            return;
        }
        assert(ans%labs(cpr(p1,p0))==0);
        if (labs(cpr(p1,p0))<ans) {
            ans = labs(cpr(p1,p0));
            anl();
        }
        return;
    }
}

void fz0(pii p2) {
    if (nvec==0) {
        p0 = p2; return;
    }
    if (nvec==1) {
        if (cpr(p0,p2)==0) {
            p0 = fix(p0,p2);
            return;
        } else {
            p1 = p2;
            nvec = 2;
            if (ans==-1) {
                ans = labs(cpr(p0,p1));
            } else {
                ans = gcd2(labs(cpr(p0,p1)),ans);
            }
            return;
        }
    }
    if (nvec==2) {
        if (labs(cpr(p0,p2))%ans!=0) {
            ans = gcd2(cpr(p0,p2),ans);
            p1 = p2;
            return;
        }
        if (labs(cpr(p1,p2))%ans!=0) {
            ans = gcd2(cpr(p1,p2),ans);
            p0 = p2;
            return;
        }
    }
}

void fz(pii p2) {
    anl();
    if (ans!=-1) {
        p2 = fmod(p2,ans);
    }
    if (p2.first==0 && p2.second==0) {
        return;
    }
    fz0(p2);
    anl();
}

int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);
    long long N; cin >> N;
    if (N<=2) {
        cout << "-1\n";
        exit(0);
    }
    long long x0,y0; cin >> x0 >> y0;
    vector<pii> v0;
    for (ll i=0;i<(N-1);i++) {
        long long x1,y1; cin >> x1 >> y1;
        v0.push_back({x1-x0,y1-y0});
    }
    ll ansS = 0;
    for (ll i=1;i<(N-1);i++) {
        ansS = gcd2(ansS,cpr(v0[0],v0[i]));
    }
    if (ansS == 0) {
        cout << "-1\n"; exit(0);
    }
    ans = ansS;
    for (pii p2: v0) {
        while(1) {
            ll ansc = ans;
            pii p0c = p0; pii p1c = p1;
            fz(p2);
            flip();
            fz(p2);
            fz(p1);
            flip();
            fz(p1);
            fz(p0);
            flip();
            fz(p0);
            ll ansc2 = ans;
            assert(ansc%ansc2==0);
            if (ansc2==ansc) {
                break;
            }
        }
    }
    cout << (long long) ans << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...