Submission #1203630

#TimeUsernameProblemLanguageResultExecution timeMemory
1203630BigBadBullyPortal (BOI24_portal)C++20
100 / 100
38 ms2120 KiB
#include <bits/stdc++.h>
#define int long long
#define pii pair<int,int>
#define ff first
#define ss second
using namespace std;
int mcd(int a,int b)
{
    if (a>b)swap(a,b);
    if (a==0)return b;
    a = abs(a),b = abs(b);
    return __gcd(a,b);
}

int exg(int a, int b, int& x, int& y) {
    if (b == 0) {
        x = 1;
        y = 0;
        return a;
    }
    int x1, y1;
    int d = exg(b, a % b, x1, y1);
    x = y1;
    y = x1 - y1 * (a / b);
    return d;
}

signed main()
{
    int n;
    cin >> n;
    vector<pii> v(n);
    for (int i = 0; i < n ;i++)
        cin >> v[i].ff >> v[i].ss;
    for (int i = n-1; i >= 0; i--)
        v[i].ff-=v[0].ff,v[i].ss-=v[0].ss;
    int x = (v[1].ss==0?v[1].ff:0), y = v[1].ss,px = v[1].ff,py = v[1].ss,up = v[1].ss;
    for (int i = 2; i < n; i++)
    {
        int add = 0;
        if (v[i].ss == 0)
            add = v[i].ff;
        else if (py!=0)
        {
            int lc = v[i].ss*py/mcd(v[i].ss,py);   
            int c1 = lc/py;
            int c2 = lc/v[i].ss;
            add = c2*v[i].ff - c1*px;
        }
        x = mcd(x,add);
        int k1,k2;
        y = exg(py,v[i].ss,k1,k2);
        py = y;
        px = k1*px + k2*v[i].ff;
        if(x)
        {
            int dum = 1000;
            while(dum*x < abs(px))
                dum*=2;
            px+=dum*x;
            px%=x;
        }
    }
    if (x*y == 0)
        cout << -1;
    else
        cout << abs(x*y);
    return 0;
}
#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...