Link:https://www.lydsy.com/JudgeOnline/problem.php?id=1407

Solution:

由于此题里n的范围很小,因此可以直接从小到大枚举m

那么问题转化为一个判定型问题:已知m,求是否会发生冲突

由于$O(m \cdot n^2)$的复杂度符合要求,枚举每一对(i,j)是否会发生冲突即可

可将问题转化为求同余式中最小的x

\[(step_i-step_j)x\equiv pos_j-pos_i(\mod m)\]

接下来就是数论里的套路了:

$ax \equiv b(\mod c)$可以转化为求$ax+cy=b$,我们可以用扩展欧几里得求出x,y值,同时顺便求出GCD。

设$k=c/gcd(a,c)$,$d=gcd(a,c)$

那么方程$ax \equiv b(\mod c)$的一个特解:$x_0=x \cdot (b/d)\mod c$。

(如果b不是d的倍数则无解)

并且它的d个解分别为:$x_i=(x_0+i*k)\mod c (i \in 0,1,2,.....d-1)$。

推导:

$$ax+cy=b$$

$$ax_0+cy_0=b$$

$$a(x-x_0) = c(y_0-y)$$

$$a/d(x-x_0) = c/d(y_0-y)$$

由于$$c/d\mid (x-x_0)$$

所以$$x = x_0+c/d*n$$

则方程ax≡b(mod c)的最小解为:$(x_0\mod k+k)\mod k$

Code:

#include <bits/stdc++.h>

using namespace std;
const int MAXN=; int n,c[MAXN],p[MAXN],l[MAXN]; int exgcd(int a,int b,int &x,int &y)
{
if(!b){x=;y=;return a;}
int ret=exgcd(b,a%b,x,y),t=x;
x=y;y=t-a/b*y;return ret;
} bool check(int m)
{
for(int i=;i<n;i++)
for(int j=i+;j<=n;j++)
{
int A=p[i]-p[j],B=c[j]-c[i],x,y,GCD=exgcd(A,m,x,y);
if(B%GCD) continue;
x=((x*B/GCD)%(m/GCD)+abs(m/GCD))%(m/GCD);
if(x<=min(l[i],l[j])) return false;
}
return true;
} int main()
{
cin >> n;int mx=;
for(int i=;i<=n;i++)
cin >> c[i] >> p[i] >> l[i],mx=max(mx,c[i]);//找到最小的初始值 for(int i=mx;i<=1e6;i++) if(check(i)) return cout << i,;
return ;
}

Review:

算是又了解一种套路了吧:

求 $ax \equiv b(\mod c)$ 中最小的x的公式:$(x_0\mod k+k)\mod k$  (先用exgcd算出$x_0$)

[BZOJ 1407] Savage的更多相关文章

  1. BZOJ 1407 Savage(拓展欧几里得)

    这题的时间复杂度真玄学... O(m*n^2).1e8也能过啊... 首先题目保证m<=1e6. 这启发我们枚举或者二分答案? 但是答案不满足单调性,考虑从小到大枚举m. 对于每一个m,枚举两个 ...

  2. BZOJ 1407: [Noi2002]Savage( 数论 )

    枚举答案, 然后O(N^2)枚举野人去判他们是否会在有生之年存在同山洞. 具体做法就是: 设第x年相遇, 则 Ci+x*Pi=Cj+x*Pj (mod M), 然后解同余方程. 复杂度应该是O(ans ...

  3. 【扩展欧几里得】Bzoj 1407: [Noi2002]Savage

    Description Input 第1行为一个整数N(1<=N<=15),即野人的数目.第2行到第N+1每行为三个整数Ci, Pi, Li (1<=Ci,Pi<=100, 0 ...

  4. 【BZOJ 1407】[Noi2002]Savage ExGCD

    我bitset+二分未遂后就来用ExGCD了,然而这道题的时间复杂度还真是玄学...... 我们枚举m然后对每一对用ExGCD判解,我们只要满足在最小的一方死亡之前无解就可以了,对于怎么用,就是ax+ ...

  5. bzoj 1407: [Noi2002]Savage

    Description 解题报告: 因为给定答案范围,暴力枚举时间,然后再两两枚举野人,判断是否有可能在某一年相遇,我们设这一年为\(x\),那么显然相交的条件是: \(x*(p[i]-p[j])+y ...

  6. 【bzoj 1407】【Noi2002】Savage

    Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci, Pi, Li表示每个野人所住的初始洞穴编号,每年走过的洞穴 ...

  7. bzoj 1407: [Noi2002]Savage【扩展欧几里得+中国剩余定理】

    首先答案不会很大,所以枚举答案m,于是把问题转为了判定: 关于如何判定: 首先题目中虽然没说但是数据是按照初始洞穴编号排的序,所以并不用自己重新再排 假设当前答案为m,相遇时间为x,野人i和j,那么可 ...

  8. bzoj [Noi2002]Savage 扩展欧几里得

    枚举m,n^2判断 对于野人i,j,(H[i]+x*S[i])%m==(H[j]+x*S[j])%m,且x<=O[i]&&x<=O[j],他们才有可能相遇 化简得:(S[i ...

  9. bzoj 1407 扩展欧几里德

    思路:枚举洞穴个数,用扩展欧几里德暴力判断没两个人的周期. #include<bits/stdc++.h> #define LL long long #define fi first #d ...

随机推荐

  1. axios超时重发

    axios的超时是在response中处理的,所以要在response中添加拦截器: axios.interceptors.response.use(undefined, function axios ...

  2. js中连写两个?:三元运算符语法解释

    在angular 源码中有连写两个三元运算符的代码: var hash = isString(hash) ? hash : isNumber(hash) ? hash.toString() :$loc ...

  3. 布局之BFC

    BFC 什么是BFC,在哪里需要用到BFC,BFC有什么规则?生成BFC有什么条件?这几个问题,我将为大家一一解释,下面我们进入正题. BFC(Block formatting context)直译为 ...

  4. 表单元素 disabled 和 readonly 辨析

    正确答案: B D 分析: Readonly 和 Disabled 是用在表单中的两个属性,它们都能够做到使用户不能够更改表单域中的内容.但是它们之间有着微小的差别,总结如下: 1)Readonly只 ...

  5. [BZOJ2453]维护队列|分块

    Description 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会 ...

  6. es查询格式

    # host://{index}/{doc_type}/ ## /car_shop/sales/index/aaa/_search

  7. 转:js中javascript:void(0) 真正含义

    from:http://www.jb51.net/article/71532.htm 在Javascript中void是一个操作符,该操作符指定要计算一个表达式但是不返回值. 我想使用过ajax的都常 ...

  8. 百度面试题——top K算法

    需求 从一亿个数据中,找出其中最小的10个数. 分析 最笨的方法就是将这一亿个数据,按从小到大进行排序,然后取前10个.这样的话,即使使用时间复杂度为nlogn的快排或堆排,由于元素会频繁的移动,效率 ...

  9. 自定义UINavigationController push和pop动画

    http://segmentfault.com/q/1010000000143983 默认的UINavigationController push和pop的默认动画都是左右滑动推出,我的应用要求这种界 ...

  10. 《Java编程思想》笔记 第二章 一切都是对象

    1.对象存储位置 对象的引用存在栈中,对象存在堆中.new 出来的对象都在堆中存储.栈的存取速度较快. 所有局部变量都放在栈内存里,不管是基本类型变量还是引用类型变量,都存储在各自的方法栈中: 但是引 ...