码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj1407

时间:2017-08-10 13:19:00      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:bit   can   color   自己的   class   bzoj   main   blog   als   

扩展欧几里得

我们发现其实就是两个野人在自己的寿命内不会相遇,或者永远不会相遇,那么我们枚举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

标签:bit   can   color   自己的   class   bzoj   main   blog   als   

原文地址:http://www.cnblogs.com/19992147orz/p/7338534.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!