bzoj1407
阿新 • • 發佈:2017-08-10
bits clas n) turn 擴展 pen ace alt 是否
擴展歐幾裏得
我們發現其實就是兩個野人在自己的壽命內不會相遇,或者永遠不會相遇,那麽我們枚舉m,然後枚舉兩個人,看是否符合條件
擴展歐幾裏得ax+by=c,這裏c不能取模,a能取模,具體不想了
#include<bits/stdc++.h> using namespace std; const int N = 20; int n; int c[N], p[N], l[N]; void ex_gcd(int a, int b, int &x, int &y) { if(b == 0) { x = 1; y = 0; }View Codeelse { ex_gcd(b, a % b, y, x); y -= x * (a / b); } } int main() { scanf("%d", &n); int low = 0; for(int i = 1; i <= n; ++i) { scanf("%d%d%d", &c[i], &p[i], &l[i]); low = max(low, c[i]); } low = max(low, n); for(intm = low; m <= 1000000; ++m) { // printf("m=%d\n", m); bool flag = true; for(int i = 1; i <= n; ++i) { for(int j = i + 1; j <= n; ++j) { int a, b, delta_v = ((p[i] - p[j]) % m + m) % m , delta_d = c[j] - c[i];if(delta_v < 0) { delta_v *= -1; delta_d *= -1; } // delta_d = (delta_d % m + m) % m; int t = __gcd(delta_v, m), tmp = m / t; if(delta_d % t != 0) continue; ex_gcd(delta_v, m, a, b); a *= delta_d / t; a = (a % tmp + tmp) % tmp; if(a <= min(l[i], l[j])) { flag = false; break; } } if(!flag) break; } if(flag) { printf("%d\n", m); return 0; } } return 0; }
bzoj1407