[BZOJ 1407] Savage
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的更多相关文章
- BZOJ 1407 Savage(拓展欧几里得)
这题的时间复杂度真玄学... O(m*n^2).1e8也能过啊... 首先题目保证m<=1e6. 这启发我们枚举或者二分答案? 但是答案不满足单调性,考虑从小到大枚举m. 对于每一个m,枚举两个 ...
- BZOJ 1407: [Noi2002]Savage( 数论 )
枚举答案, 然后O(N^2)枚举野人去判他们是否会在有生之年存在同山洞. 具体做法就是: 设第x年相遇, 则 Ci+x*Pi=Cj+x*Pj (mod M), 然后解同余方程. 复杂度应该是O(ans ...
- 【扩展欧几里得】Bzoj 1407: [Noi2002]Savage
Description Input 第1行为一个整数N(1<=N<=15),即野人的数目.第2行到第N+1每行为三个整数Ci, Pi, Li (1<=Ci,Pi<=100, 0 ...
- 【BZOJ 1407】[Noi2002]Savage ExGCD
我bitset+二分未遂后就来用ExGCD了,然而这道题的时间复杂度还真是玄学...... 我们枚举m然后对每一对用ExGCD判解,我们只要满足在最小的一方死亡之前无解就可以了,对于怎么用,就是ax+ ...
- bzoj 1407: [Noi2002]Savage
Description 解题报告: 因为给定答案范围,暴力枚举时间,然后再两两枚举野人,判断是否有可能在某一年相遇,我们设这一年为\(x\),那么显然相交的条件是: \(x*(p[i]-p[j])+y ...
- 【bzoj 1407】【Noi2002】Savage
Description Input 第1行为一个整数N(1<=N<=15),即野人的数目. 第2行到第N+1每行为三个整数Ci, Pi, Li表示每个野人所住的初始洞穴编号,每年走过的洞穴 ...
- bzoj 1407: [Noi2002]Savage【扩展欧几里得+中国剩余定理】
首先答案不会很大,所以枚举答案m,于是把问题转为了判定: 关于如何判定: 首先题目中虽然没说但是数据是按照初始洞穴编号排的序,所以并不用自己重新再排 假设当前答案为m,相遇时间为x,野人i和j,那么可 ...
- 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 ...
- bzoj 1407 扩展欧几里德
思路:枚举洞穴个数,用扩展欧几里德暴力判断没两个人的周期. #include<bits/stdc++.h> #define LL long long #define fi first #d ...
随机推荐
- 【BZOJ 1409】 Password 数论(扩展欧拉+矩阵快速幂+快速幂)
读了一下题就会很愉快的发现,这个数列是关于p的幂次的斐波那契数列,很愉快,然后就很愉快的发现可以矩阵快速幂一波,然后再一看数据范围就......然后由于上帝与集合对我的正确启示,我就发现这个东西可以用 ...
- taotao前台页面显示登录用户名的处理
思路: 在每个页面上都引入一个 jsp,这个 jsp 可以是页面的头 head 或者脚 footer.jsp 然后在这个 jsp 中引入 一个 js,这个 js 中 有个 随页面加载 而执行的 方法, ...
- 洛谷P1282 多米诺骨牌 (DP)
洛谷P1282 多米诺骨牌 题目描述 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点.现有排成行的 上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|.例如在图8-1中 ...
- Linux设置虚拟内存-创建和启用Swap交换区
如果你的服务器的总是报告内存不足,并且时常因为内存不足而引发服务被强制kill的话,在不增加物理内存的情况下,启用swap交换区作为虚拟内存是一个不错的选择,如果是SSD硬盘,正常读写速度都在300M ...
- [04] css 选择器
1.元素选择器 常见的html标签元素 h1 { color: red; } body { background: red; } 2.分组选择器 例如body和h2标签的字体颜色都是red,使用逗号将 ...
- javascript实现瀑布流效果(固定宽度)
HTML代码: <div id="content"> <div class="box"> <div class="img ...
- 【Foreign】异色弧 [树状数组]
异色弧 Time Limit: 20 Sec Memory Limit: 256 MB Description Input Output 仅一行一个整数表示答案. Sample Input 8 1 ...
- BZOJ 1598 牛跑步
牛跑步 [问题描述] BESSIE准备用从牛棚跑到池塘的方法来锻炼. 但是因为她懒,她只准备沿着下坡的路跑到池塘, 然后走回牛棚. BESSIE也不想跑得太远,所以她想走最短的路经. 农场上一共有M ...
- LCD实验学习笔记(三):WATCH DOG
看门狗是为了能够防止程序跑飞用的.程序应该定时的去喂狗.如果程序跑飞了,那么就不会去喂狗了.如果超过了喂狗的时间,那么狗就会生成一个信号来reset CPU.一般程序不需要,特殊情况下需要这种机制. ...
- algorithm ch6 heapsort
堆排序利用的是堆这种数据结构来对进行排序,(二叉)堆可以被视为一棵完全的二叉树,树的每个节点与数组中存放该节点的值得那个元素对应.这里使用最大堆进行排序算法设计,最大堆就是parent(i) > ...