晚上做到的一个扩欧的水题(?)

wa了好几发感觉自己药丸…重新推了一遍公式才发现自己打错了orz

借此复习一下扩欧吧…orz

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1407


看到这里的人应该都知道扩欧是干嘛的吧…如果不知道也没关系下面有…

欧几里得辗转相除:$gcd(a,b)=gcd(b,a \mod b)$,证明可以看下面。

扩展欧几里得:

考虑方程$ax+by=gcd(a,b)$,如果$b=0$则直接有$x=1,y=0$,否则通过上面的式子可以得到$$ax+by=gcd(a,b)=gcd(b,a\mod b)=bx+(a\mod b)y=bx+(a-b*\lfloor \frac{b}{a} \rfloor)y$$然后根据$a,b$合并同类项:$$ax+by=ay+b*(x-\lfloor \frac{a}{b} \rfloor y)$$ 看,他出现了递归的形式!所以我们就可以递归的求了(返回的是$gcd(a,b)$):

inline int exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1;y=0;return a;}
int d=exgcd(b,a%b,x,y);
int tx,ty;tx=y;ty=x-a/b*y;
x=tx;y=ty;
return d;
}

好了刚刚说过下面要证明辗转相除法,假如我们通过辗转相除法求出了$d=gcd(a,b)=ax+by$,我们怀疑有一个更大的公约数$d'$因为某些原因没有被找到,但是这是不存在的~因为如果有这样的一个$d'$,作为$a,b$的$gcd$一定整除$ax+by$,一定整除$d$,所以一定$\leq d$。此外也容易验证求出来的$d$一定整除$a,b$,所以就是真的最大公约数啦~

可以证明复杂度是$O(log n)$的。

不过我们一般不是直接用上面的方程,实际上更多的是讨论$ax+by=c$这个不定方程的解。

把方程两边同除掉$gcd(a,b)$:$$\frac{a}{gcd(a,b)}x+\frac{b}{gcd(a,b)}y=\frac{c}{gcd(a,b)}$$ 这里的其他项都是整数,所以要有解的充要条件就是$gcd(a,b)|c$了。如果它有解的话就先求出$ax+by=gcd(a,b)$的一组解$(x_0,y_0)$,将解代到方程里之后再将两边都乘上$k=\frac{c}{gcd(a,b)}$就得到了$kax_0+kby_0=c$,从而原方程的一组特解就是$x=kx_0,y=ky_0$了。

如果我们要求出其他的解(通解)怎么办?也就是我们想要找一组最小的$\Delta x,\Delta y$使得$a(x+\Delta x)+b(y+\Delta y)=c$,结合$ax+by=c$我们可以得到$a \Delta x+b \Delta y =0$

哎呀这个要怎么弄呀,构造!令$d=gcd(a,b)$,根据$ab-ba=0$我们给他同除掉$d$就可以得到一个有用的等式:$a\frac{b}{d}-b\frac{a}{d}=0$,很显然$\Delta x=\frac{b}{gcd(a,b)},\Delta y=-\frac{a}{gcd(a,b)}$,而且这里的$\Delta x,\Delta y$一定是满足条件的最小值了,因为不能再除了。

好了现在回到我们的题目,$n$非常小,又保证了答案的范围,我们可以直接枚举答案$m$然后判断是否对于所有$i \not = j$都满足同余方程$c_i+x*p_i \equiv c_j+x*p_j \pmod m$无解或解比$min(l_i,l_j)$还小,这个方程可以直接转换成$x(p_i-p_j)-my = c_j-c_i$来做

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=17;
int n,m;
int c[N],p[N],l[N]; inline int gcd(int a,int b)
{
return !b?a:gcd(b,a%b);
}
inline int exgcd(int a,int b,int &x,int &y)
{
if(b==0){x=1;y=0;return a;}
int d=exgcd(b,a%b,x,y);
int tx,ty;tx=y;ty=x-a/b*y;
x=tx;y=ty;
return d;
}
inline bool check()
{
for(register int i=1;i<=n;i++)
{
for(register int j=i+1;j<=n;j++)
{
int ta,tb,tc,t,x,y;
ta=p[i]-p[j];tb=m;tc=c[j]-c[i];
t=gcd(ta,tb);
if(tc%t)continue;
ta/=t;tb/=t;tc/=t;exgcd(ta,tb,x,y);
tb=abs(tb);x=((x*tc)%tb+tb)%tb;if(!x)x+=tb;
if(x<=min(l[i],l[j]))return 0;
}
}
return 1;
}
int main()
{
scanf("%d",&n);
for(register int i=1;i<=n;i++)scanf("%d%d%d",&c[i],&p[i],&l[i]),m=max(m,c[i]);
while(1)
{
if(check())break;
m++;
}
printf("%d",m);
return 0;
}

[日常摸鱼]bzoj1470[noi2002]Savage的更多相关文章

  1. Hash 日常摸鱼笔记

    本篇文章是Hash在信息学竞赛中的应用的学习笔记,分多次更新(已经有很多坑了) 一维递推 首先是Rabin-Karp,对于一个长度为\(m\)的串\(S\) \(f(S)=\sum_{i=1}^{m} ...

  2. [日常摸鱼]HDU1724 Ellipse-自适应Simpson法

    模板题~ QAQ话说Simpson法的原理我还是不太懂-如果有懂的dalao麻烦告诉我~ 题意:每次给一个椭圆的标准方程,求夹在直线$x=l$和$x=r$之间的面积 Simpson法 (好像有时候也被 ...

  3. [日常摸鱼]bzoj1257余数之和

    题意:输入$k,n$,求$\sum_{i=1}^n k \mod i$ $k \mod i=k-i*\lfloor \frac{k}{i} \rfloor $,$n$个$k$直接求和,后面那个东西像比 ...

  4. [日常摸鱼]bzoj1001狼抓兔子-最大流最小割

    题意就是求最小割- 然后我们有这么一个定理(最大流-最小割定理 ): 任何一个网络图的最小割中边的容量之和等于图的最大流. (下面直接简称为最大流和最小割) 证明: 如果最大流>最小割,那把这些 ...

  5. [日常摸鱼]pojKaka's Matrix Travels-拆点+最大费最大流

    方格取数的升级版,每个格子最多取一次. $k=1$的话就是个普及组的dp题,$k=2$就是在之前的基础上多加两维. 然而现在$k$太大了当然就不dp啦 对于$k=1$的情况我们还可以把$(i,j)$向 ...

  6. [日常摸鱼]loj6000「网络流 24 题」搭配飞行员

    题面 应该是二分图匹配,不过我写的是网络最大流. dinic求二分图最大匹配:加个源点和汇点,源点连向二分图的一边所有点,二分图的另一边所有点连向汇点,很明显这样得到的最大流就是这个二分图的最大匹配. ...

  7. [日常摸鱼]poj1741Tree-点分治

    还有两天就要去FJWC啦- 题意:一颗无根树,$k$为给定常数,求树上距离不超过$k$的点对的数量,多组数据,$n \leq 10^4$. 应该是点分治经典题~ 一般对于无根树我们都可以把它转变成有根 ...

  8. [日常摸鱼]bzoj1218[HNOI2003]激光炸弹-二维前缀

    题意:二维网格一些格子有权值,求用边长为$r$的正方形能覆盖到格子权值和的最大值,格子大小$ \leq 5000$ 非常裸的二维前缀,然而 题目下标从0开始! QAQ 要是比赛就要爆零啦- #incl ...

  9. [日常摸鱼]bzoj2724蒲公英-分块

    区间众数经典题~ http://begin.lydsy.com/JudgeOnline/problem.php?id=4839这里可以提交~ 题意大概就是没有修改的询问区间众数,如果有一样的输出最小的 ...

随机推荐

  1. 面试阿里,字节跳动,华为必须知道的Java创建对象的5种方式

    Java创建对象的5种方式 1.直接new,调用了构造器2.通过clone(),没有调用构造器3.通过反射,调用了构造器4.通过反序列化,没有调用构造器5.通过Unsafe类的allocateInst ...

  2. EasyRecovery帮您轻松拯救办公室断电后的文件丢失

    故事要从半个月前说起,某天中午,社畜小编得到了上头的传令,要为即将到来的双十一狂欢节写一个活动策划案. 想着时间也不是很充裕,还要留一些时间修修补补,于是小编连续三天挑灯夜战,终于在某天周五的晚上把策 ...

  3. Folx专业版任务计划功能详解

    Folx专业版的任务计划功能允许用户以时间表的方式,制定下载计划.按照预先设定的时间计划,Folx会在指定的时间段内,自动开启或停止下载任务. 另外,用户还可以设置自动关机功能.当计划下载任务停止时, ...

  4. H5系列之新input

    虽说H5 新填了几个很方便的input 类型,但是吧,想法是美好的,但是现实很残酷,兼容性不太好.基本只有google浏览器能用.但是既然出了,那么就要了解他,知道有这么一个东西就好. input类型 ...

  5. web自动化测试--iframe切换

    什么是iframe切换,我们在测试web网页过程中,可能会遇到一个网页中嵌套另一个网页的情况,如下图,就是一个ifame嵌套的例子 我们如何切换呢,别急,webdriver里有方法,可以切换到ifra ...

  6. 牛客练习赛67 D牛妹爱数列 题解(dp)

    题目链接 题目大意 给你一个长为n的01串,要你进行最少的操作使得这01串变成全为0,求最少操作次数 有两种不同类型的操作 1:翻转一个前缀 2:单调翻转一个元素 题目思路 居然是一个dp,标程讲的很 ...

  7. 测试:DOCX

    先拿到的是需求文档和接口文档以及测试用例模块,[以及之前写好的测试用例]再根据分配的任务进行编写用例 [智能看懂业务需求]现有功能点,在编写用例 [项目介绍]: 辽阳农商惠生活项目是作为一个农户和银行 ...

  8. PyQt+moviepy音视频剪辑实战2:一个剪裁视频文件精华内容留存工具的实现

    专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 PyQt+moviepy音视频剪辑实战 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 一.引言 ...

  9. PyQt(Python+Qt)学习随笔:QAbstractItemView的editTriggers属性以及平台编辑键(platform edit key )

    老猿Python博文目录 老猿Python博客地址 editTriggers属性 editTriggers属性用于确认哪些用户操作行为会触发ItemView中的数据项进入编辑模式. 此属性是由枚举类E ...

  10. 函数与函数式编程(生成器 && 列表解析 && map函数 && filter函数)-(四)

    在学习python的过程中,无意中看到了函数式编程.在了解的过程中,明白了函数与函数式的区别,函数式编程的几种方式. 函数定义:函数是逻辑结构化和过程化的一种编程方法. 过程定义:过程就是简单特殊没有 ...