1. 程式人生 > >bzoj1407

bzoj1407

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;
    }
    
else { 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(int
m = 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; }
View Code

bzoj1407