bzoj1477 && exgcd学习笔记
exgcd
由于忘记了exgcd,这道题就没做出来。。。
exgcd的用处是求ax+by=gcd(a,b)这样方程的解
大概是这个样子的
void ext_gcd(long long a, long long b, long long &x, long long &y)
{
if(b == )
{
x = ;
y = ;
}
else
{
ext_gcd(b, a % b, y, x);
y -= x * (a / b);
}
}
证明大概是ax+by=gcd(a,b)
根据gcd的性质bx'+(a%b)y'=gcd(b,a%b)
这样就是求出了上面这个方程的解,我们要做的就是通过x',y'求出x,y
怎么求呢,就是把方程化回ax+by=gcd(a,b)的形式,由于gcd(a,b)=gcd(b,a%b),所以这样的解是相同的
bx'+(a-a/b*b)y'=c (c=gcd(b,a%b))
ay'+b(x'-a/b*y')=c
那么就有x=y',y=x'-a/b*y'
那么我们就先exgcd(b,a%b,y,x),这样求出了x',y'我们要返回x,y,由于传入了y,x,所以x=y'已经求好了,那么就是y,现在y=x',x=y',那么y=x'-a/b*y',y=y-a/b*x,然后返回就行了
边界条件是b=0,a=...,这样就是ax+by=gcd(a,b),ax+0*y=a,那么自然可以得出x=1,y=0是一组解,顺便也求出了gcd
那么这道题可以列出方程am+y-x=an (mod l),那么移一下项,得出a(m-n)=x-y (mod l),那么相当于求(m-n)*a+b*l=x-y 的最小a的解,这不就是exgcd吗?但是x-y不是gcd(m-n,l),怎么解决呢?
我们先求出一组解,(m-n)*a'+b*l=gcd(m-n,l) 设t=gcd(m-n,l)
如果(x-y)%t != 0那么就没有解,因为如果有一组解,那么左边的式子可以整除t,右边却不能,这很明显矛盾
所以我们对于(m-n)*a'+b*l=gcd(m-n,l) 设t=gcd(m-n,l)得出来的解,两边同乘以(x-y)/t就是原来的那个方程了,那么把a'和b'同时乘以(x-y)/t就得出一组a和b了,但是这不一定是最小的,于是我们要对l/t取模,至于为什么是l/t,具体是这样的
我们可以把刚才那个方程看成一个线性同余方程,那么就是ax=b (mod n)
我们求的是最小解的间隔,这个间隔能帮我们求出最小的正整数解,设这个间隔为d,那么自然a(x+d)=b (mod n)
和ax=b (mod n)减一下就是 a*d=0 (mod n),那么我们可以知道a*d是n和a的公倍数,如果想让d最小,那么a*d应该等于lcm(a,n),a*d=lcm(a,n),因为lcm(a,n)=a*n/gcd(a,n),那么就是a*d=a*n/gcd(a,n)
d=n/gcd(a,n),就是刚才那个l/t,所以这个d和l/t就是原方程解的最小周期,取模就能求出最小解
参考http://www.cnblogs.com/frog112111/archive/2012/08/19/2646012.html
http://m.blog.csdn.net/LiRewriter/article/details/76762084
Ax+By=C
当C%gcd(a,b)==0有解
A,B,C不管正负
通解:x=x0+bt,y=yo-at
最小正整数解:t=b/gcd(a,b) x=(x%t+t)%t
方程ax≡c(mod b)⇔ax+by=c
求逆元:ax=1(mod b)
相当于求ax+by=1 最小正整数解:x+b*b/gcd(a,b)
#include<bits/stdc++.h>
using namespace std;
long long x, y, m, n, l;
void ext_gcd(long long a, long long b, long long &x, long long &y)
{
if(b == )
{
x = ;
y = ;
}
else
{
ext_gcd(b, a % b, y, x);
y -= x * (a / b);
}
}
int main()
{
scanf("%lld%lld%lld%lld%lld", &x, &y, &m, &n, &l);
if(m < n)
{
swap(n, m);
swap(x, y);
}
long long delta_v = m - n, delta_d = ((y - x) % l + l) % l, t = __gcd(delta_v, l), a, b;
if(delta_d % t != )
{
puts("Impossible");
return ;
}
ext_gcd(delta_v, l, a, b);
// printf("a=%lld t=%lld delta_d=%lld\n", a, t, delta_d);
l /= t;
a *= delta_d / t;
a = (a % l + l) % l;
printf("%lld", a);
return ;
}
bzoj1477 && exgcd学习笔记的更多相关文章
- 扩展欧几里得算法(exGCD)学习笔记
@(学习笔记)[扩展欧几里得] 本以为自己学过一次的知识不会那么容易忘记, 但事实证明, 两个星期后的我就已经不会做扩展欧几里得了...所以还是写一下学习笔记吧 问题概述 求解: \[ax + by ...
- exgcd学习笔记
扩展欧几里得算法是当已知a和b时,求得一组x和y使得 首先,根据数论中的相关定理,解一定存在 //留坑待填 之后我们可以推一推式子 将a替换掉 展开括号 提出b,合并 且 设 现在已经将 ...
- exgcd 学习笔记
最大公约数 更相减损术:\(\gcd(x,y)=\gcd(x,y-x)(x\leq y)\). 证明: 设 \(\gcd(x,y)=k\),则 \(x=kp,y=kq,\gcd(p,q)=1\). 那 ...
- 扩展中国剩余定理 exCRT 学习笔记
前言 由于 \(\{\mathrm{CRT}\}\subseteq\{\mathrm{exCRT}\}\),而且 CRT 又太抽象了,所以直接学 exCRT 了. 摘自 huyufeifei 博客 这 ...
- 数论算法 剩余系相关 学习笔记 (基础回顾,(ex)CRT,(ex)lucas,(ex)BSGS,原根与指标入门,高次剩余,Miller_Rabin+Pollard_Rho)
注:转载本文须标明出处. 原文链接https://www.cnblogs.com/zhouzhendong/p/Number-theory.html 数论算法 剩余系相关 学习笔记 (基础回顾,(ex ...
- exLucas学习笔记
exLucas学习笔记 Tags:数学 写下抛硬币和超能粒子炮改 洛谷模板代码如下 #include<iostream> #define ll long long using namesp ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- OI知识点|NOIP考点|省选考点|教程与学习笔记合集
点亮技能树行动-- 本篇blog按照分类将网上写的OI知识点归纳了一下,然后会附上蒟蒻我的学习笔记或者是我认为写的不错的专题博客qwqwqwq(好吧,其实已经咕咕咕了...) 基础算法 贪心 枚举 分 ...
- 「ExLucas」学习笔记
「ExLucas」学习笔记 前置芝士 中国剩余定理 \(CRT\) \(Lucas\) 定理 \(ExGCD\) 亿点点数学知识 给龙蝶打波广告 Lucas 定理 \(C^m_n = C^{m\% m ...
随机推荐
- 第一章 React新的前端思维方式
---恢复内容开始--- 第一章 React新的前端思维方式 1.1 初始化一个React项目 1.安装create-react-app npm install --global create-rea ...
- https报错注销源文件内容
open -a pycharm /Users/vivi/Library/Python/3.6/lib/python/site-packages/requests/packages/urllib3/co ...
- LINUX-用户和群组
groupadd group_name 创建一个新用户组 groupdel group_name 删除一个用户组 groupmod -n new_group_name old_group_name 重 ...
- SVM简单上手示例
转载自 百度知道 id:风_南(https://zhidao.baidu.com/usercenter?uid=e9904069236f25705e799313) 转载只为方便学习复习,侵删. 在用s ...
- codechef营养题 第二弹
第二弾が始まる! codechef problems 第二弹 一.Backup Functions 题面 One unavoidable problem with running a restaura ...
- JavaScript及Java对JSON的相关处理
JavaScript中JSON字符串与JSON对象的互转及JSON对象的取值: var jsonString = '{"key1":"value1"," ...
- vue项目使用static目录存放图片解决方案
我个人喜欢把所有引用文件全部放在打包文件src的同级文件static文件内部,方便整合. 提醒:vue项目中正常情况下图片是由 url-loader 处理,加入了hash值,如果放到static里面w ...
- nyoj 63 小猴子下落
小猴子下落 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 有一颗二叉树,最大深度为D,且所有叶子的深度都相同.所有结点从左到右从上到下的编号为1,2,3,····· ...
- 17、Java并发性和多线程-避免死锁
以下内容转自http://ifeve.com/deadlock-prevention/: 在有些情况下死锁是可以避免的.本文将展示三种用于避免死锁的技术: 加锁顺序 当多个线程需要相同的一些锁,但是按 ...
- MyBatis3教程
MyBatis3教程: http://www.yihaomen.com/article/java/302.htm http://www.mybatis.org/mybatis-3/zh/index.h ...