59: loj #10215

$des$

https://loj.ac/problem/10215

$sol$

exgcd检查

$code$

#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <cstdio>

using namespace std;

#define gc getchar()
inline int read() {
    int x = 0; char c = gc;
    while(c < '0' || c > '9') c = gc;
    while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = gc;
    return x;
}

#define LL long long

const int N = 20;

LL C[N], P[N], L[N];
int n;
int M = 1e6;

LL Exgcd(LL a, LL b, LL &x, LL &y) {
    if(b == 0) {
        x = 1, y = 0; return a;
    }
    LL gg = Exgcd(b, a % b, x, y);
    LL tmp = x;
    x = y, y = tmp - a / b * y;
    return gg;
}

bool Solve(LL k) {
    for(int i = 1; i <= n; i ++) {
        for(int j = i + 1; j <= n; j ++) {
            LL c1 = C[i], c2 = C[j], p1 = P[i], p2 = P[j], x, y;
            LL b = p1 - p2, d = c2 - c1;
            if(b < 0) b = -b, d = -d;
            LL g = Exgcd(b, k, x, y);
            if(d % g) continue;
            x *= (d / g);
            LL r = k / g;
            while(x < 0) x += r;
            x %= r;
            if(x <= min(L[i], L[j])) return 0;
        }
    }
    return 1;
}

int main() {
    n = read();
    LL Max = 0;
    for(int i = 1; i <= n; i ++)
        C[i] = read(), P[i] = read(), L[i] = read(), Max = max(Max, C[i]);
    int a;
    for(a = Max; a <= M; a ++) {
        if(Solve(1ll * a)) {
            cout << a; return 0;
        }
    }
    
    return 0;
}

 

posted @ 2018-11-05 17:59  xayata  阅读(90)  评论(0编辑  收藏  举报