BZOJ 1407 Savage

怎么枚举下答案就过了。。。。

以后exgcd还是这么写比较稳当。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define maxn 20
using namespace std;
int n,c[maxn],p[maxn],l[maxn],mx=0,x,y;
int gcd(int a,int b)
{
    if (b==0) return a;
    return gcd(b,a%b);
}
void exgcd(int a,int b,int &x,int &y)
{
    if (b==0) {x=1;y=0;return;}
    exgcd(b,a%b,x,y);
    int t=x;x=y;y=t-a/b*y;
}
bool judge(int m)
{
    for (int i=1;i<=n;i++)
        for (int j=i+1;j<=n;j++)
        {
            int a=p[i]-p[j],b=c[j]-c[i],z=m;
            int d=gcd(a,z);
            if (b%d) continue;
            a/=d;z/=d;b/=d;
            exgcd(a,z,x,y);
            z=abs(z);x=((x*b)%z+z)%z;if (!x) x=z;
            if (x<=min(l[i],l[j])) return false;
        }
    return true;
}
int main()
{
    scanf("%d",&n);
    for (int i=1;i<=n;i++)
    {
        scanf("%d%d%d",&c[i],&p[i],&l[i]);
        mx=max(mx,c[i]);
    }
    for (int i=mx;i<=1000000;i++)
    {
        if (judge(i))
        {
            printf("%d\n",i);
            return 0;
        }
    }
    printf("-1\n");
    return 0;
} 
时间: 2024-10-27 01:06:00

BZOJ 1407 Savage的相关文章

BZOJ 1407 Savage(拓展欧几里得)

这题的时间复杂度真玄学... O(m*n^2).1e8也能过啊... 首先题目保证m<=1e6. 这启发我们枚举或者二分答案? 但是答案不满足单调性,考虑从小到大枚举m. 对于每一个m,枚举两个野人在有生之年能否住在一起.可以推出一个同余方程,用扩欧可以求出最小整数解x,或者没有解. 如果x<=life[i]&&x<=life[j]那么当然不满足条件. # include <cstdio> # include <cstring> # include

BZOJ 1407: [Noi2002]Savage( 数论 )

枚举答案, 然后O(N^2)枚举野人去判他们是否会在有生之年存在同山洞. 具体做法就是: 设第x年相遇, 则 Ci+x*Pi=Cj+x*Pj (mod M), 然后解同余方程. 复杂度应该是O(ans*N^2log(ans)), 但是实际远小于....能够AC -------------------------------------------------------------------- #include<cstdio> #include<algorithm> #inclu

【BZOJ 1407】[Noi2002]Savage ExGCD

我bitset+二分未遂后就来用ExGCD了,然而这道题的时间复杂度还真是玄学...... 我们枚举m然后对每一对用ExGCD判解,我们只要满足在最小的一方死亡之前无解就可以了,对于怎么用,就是ax+by=c,在这里c是距离差,a是速度差,b是m,x是我们要的解,y随意. 时间复杂度O(m*n*n*log),然而这是标解.......... #include <cstdio> int prob[120][3],len,n,c[16],p[16],l[16],S; inline int Min(

bzoj 1407 [Noi2002]Savage

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1407 因为答案有很小的限制,所以可以枚举.(听说不能二分?) T*p[ i ] + c[ i ] = T*p[ j ] + c[ j ](mod m) <==>T*(p[ i ] - p[ j ]) + k * m = c[ j ] - c[ i ] 然后需要打一个正确的板子. 放一点笔记: exgcd有解,仅当得数是gcd的倍数.这样可以求出特解后同乘一个数得到解.ax+by=c的通解

bzoj 1407

裸最大权封闭子图 1 #include<bits/stdc++.h> 2 #define inc(i,l,r) for(int i=l;i<=r;i++) 3 #define dec(i,l,r) for(int i=l;i>=r;i--) 4 #define link(x) for(edge *j=h[x];j;j=j->next) 5 #define mem(a) memset(a,0,sizeof(a)) 6 #define inf 1e9 7 #define ll l

【BZOJ】1407 NOI 2002 荒岛野人Savage

拓展欧几里得入门题 两个野人若要走到同一个洞穴,设他们走了x步,则p[i]*x+c[i]≡p[j]*x+c[j](mod ans),ans即答案: 移项得到(p[i]-p[j])*X+ansY=c[j]-c[i]; 即aX+bY+=C的形式,枚举ans,n^2的枚举每一个野人,用ex_gcd求得最小解,看X是否在他们的生命时间内. 1 /************************************************************** 2 Problem: 1407 3

bzoj 1000+AC

1500 [NOI2005]维修数列   5333 16036 1010 [HNOI2008]玩具装箱toy   5205 12140 2049 [Sdoi2008]Cave 洞穴勘测   4992 10282 1008 [HNOI2008]越狱   4820 11120 1503 [NOI2004]郁闷的出纳员   4629 12915 1208 [HNOI2004]宠物收养所   4216 10462 1026 [SCOI2009]windy数   4169 9168 1003 [ZJOI2

BZOJ 1013: [JSOI2008]球形空间产生器sphere

二次联通门 : BZOJ 1013: [JSOI2008]球形空间产生器sphere /* BZOJ 1013: [JSOI2008]球形空间产生器sphere 高斯消元 QAQ SB的我也能终于能秒题了啊 设球心的坐标为(x,y,z...) 那么就可以列n+1个方程,化化式子高斯消元即可 */ #include <cstdio> #include <iostream> #include <cstring> #define rg register #define Max

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445