数论 + 扩展欧几里得 - SGU 106. The equation
The equation
Problem's Link
Mean:
给你7个数,a,b,c,x1,x2,y1,y2.求满足a*x+b*y=-c的解x满足x1<=x<=x2,y满足y1<=y<=y2.求满足条件的解的个数.
analyse:
做法是扩展欧几里德.
1.首先是欧几里德算法,欧几里德算法是用于求任意两个数的最大公约数(gcd(a,b)),
这个方法基于一个定理,gcd(a,b)=gcd(b,a % b)(a>b),%表示取模.
我们来证明上述定理,因为a>b,所以我们可以将a表示成a=kb+r,
假设gcd(a,b)=d,也就是两个数的最大公约数为d.
那么d|a,d|b,这是显然的.
又因为r=a-kb,所以d|r.
而r的值就像当于a % b,
所以gcd(a,b)=gcd(b,a%b).
2、欧几里德扩展算法。根据贝祖定理,如果gcd(a,b)=d,那么一定存在整数x,y使得a*x+b*y=gcd(a,b)=d.并且a和b的线性和都为d的整数倍.
欧几里德扩展算法就是用来求出这个线性方程的一个解的。注意,只是其中一个解.
首先设两个数aa=b,bb=a%b=a-a/b*b;
因为gcd(a,b)=gcd(b,a%b)=gcd(aa,bb).
所以aa*xx+bb*yy=gcd(aa,bb)=gcd(a,b)
我们用a和b来表示aa,bb.
所以b*xx+(a-a/b*b)yy=gcd(a,b)
a*yy+b*(xx-a/b*yy)=gcd(a,b).
对照不定方程a*x+b*y=gcd(a,b)
我们可以得到该不定方程的解为x=yy,y=xx-a/b*yy.
当我们递归上述操作时会得到b=0的情况,此时式子相当与a*xx=a,
所以此时xx=1,yy=0;以此做返回值.
3、对于a*x+b*y=n这个不定方程的求解。
根据贝祖定理,我们知道a*x+b*y这个不定方程的值一定是gcd(a,b)的整数倍。
那么如果n不是gcd(a,b)的倍数,该不定方程一定没有整数解。
我们先求解出gcd(a,b).
方程两边同时除以gcd(a,b).我们假设aa=a/gcd(a,b),bb=b/gcd(a,b),nn=n/gcd(a,b)
所以方程两边同时除以gcd(a,b)后,
可以得到一个方程aa*x+bb*y=nn.
并且该方程aa*x+bb*y=nn的解x,y就是a*x+b*y=n的解。
我们转化成这个方程有什么用处呢?
用处就在于gcd(aa,bb)=1.
我们只要求解出aa*x+bb*y=1的其中一个解,设这两个解为x0,y0.
那么aa*x+bb*y=nn的其中一个解解就是x0*nn,y0*nn.
接着,a*x+b*y=n的其中一个解解也就是x0*nn,y0*nn.
很显然,这道题目要我们求解的个数,一个解是不够的。
我们继续看a*x+b*y=n这个式子,它的一个解为x0*nn,y0*nn.我们尝试代入,得到
a*(x0*nn)+b*(y0*nn)=n.
我们会发现
a*(x0*nn+1*b)+b*(y0*nn-1*a)=n
a*(x0*nn-1*b)+b*(y0*nn+1*a)=n.
继续推广
a*(x0*nn+k*b)+b*(y0*nn-k*a)=n (k属于整数)
nn=n/gcd(a,b).
那么一个结论出来了
『x=x0*nn+k*b
y=y0*nn-k*a
k属于整数
nn=n/gcd(a,b)
x0,y0,为a/gcd(a,b)*x+b/gcd(a,b)*y=1的一个解』
为原不定方程a*x+b*y=n的所有解。
4、关于sgu106的求解。
sgu106与a*x+b*y=n这个不定方程求解这两个问题的不同之处就在于。
sgu106的解有取值范围。
我们把x0*nn,y0*nn看成两个常数xz,yz.
那么原方程解就变成两个一次函数
x=k*b+xz(1)
y=-k*a+yz(2)
sgu106这道题就转化成为了求k所能够取到的整数个数
首先,弄清出已知与未知。
我们已知xz,yz,也已知方程左边的x和y的取值范围为x1到x2,y1到y2,也已知a和b
我们只需要求出k即可。
对于方程(1),我们带入x1,x2当作x的值,那么可以求出k1,k2(k1<k2)
同理,带入(2),我们可以求出k3,k4.(k3<k4)
那么我们最后的答案ans=min(k2,k4)-max(k1,k3)+1即可。
Time complexity: O(N)
view code
;
;
)
;
)
));
)
;
)
;
))
;
)
;
);
)
;
))))))));
;
}
数论 + 扩展欧几里得 - SGU 106. The equation的更多相关文章
- interesting Integers(数学暴力||数论扩展欧几里得)
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAwwAAAHwCAIAAACE0n9nAAAgAElEQVR4nOydfUBT1f/Hbw9202m0r8
- [ZLXOI2015]殉国 数论 扩展欧几里得
题目大意:已知a,b,c,求满足ax+by=c (x>=0,y>=0)的(x+y)最大值与最小值与解的个数. 直接exgcd,求出x,y分别为最小正整数的解,然后一算就出来啦 #inclu ...
- 数论--扩展欧几里得exgcd
算法思想 我们想求得一组\(x,y\)使得 \(ax+by = \gcd(a,b)\) 根据 \(\gcd(a,b) = \gcd(b,a\bmod b)\) 如果我们现在有\(x',y'\) 使得 ...
- SGU 106 The equation 扩展欧几里得好题
扩展欧几里得的应用……见算法竞赛入门经典p.179 注意两点:1.解不等式的时候除负数变号 2.各种特殊情况的判断( a=0 && b=0 && c=0 ) ( a=0 ...
- 【64测试20161112】【Catalan数】【数论】【扩展欧几里得】【逆】
Problem: n个人(偶数)排队,排两行,每一行的身高依次递增,且第二行的人的身高大于对应的第一行的人,问有多少种方案.mod 1e9+9 Solution: 这道题由1,2,5,14 应该想到C ...
- 【数论】【扩展欧几里得】Codeforces 710D Two Arithmetic Progressions
题目链接: http://codeforces.com/problemset/problem/710/D 题目大意: 两个等差数列a1x+b1和a2x+b2,求L到R区间内重叠的点有几个. 0 < ...
- SGU 140 扩展欧几里得
题目大意: 给定序列a[] , p , b 希望找到一个序列 x[] , 使a1*x1 + a2*x2 + ... + an*xn = b (mod p) 这里很容易写成 a1*x1 + a2*x2 ...
- JZYZOJ1371 青蛙的约会 扩展欧几里得 GTMD数论
http://172.20.6.3/Problem_Show.asp?id=1371 题意是两个青蛙朝同一个方向跳 http://www.cnblogs.com/jackge/archive/2013 ...
- 【bzoj2242】: [SDOI2011]计算器 数论-快速幂-扩展欧几里得-BSGS
[bzoj2242]: [SDOI2011]计算器 1.快速幂 2.扩展欧几里得(费马小定理) 3.BSGS /* http://www.cnblogs.com/karl07/ */ #include ...
随机推荐
- LDA基本介绍以及LDA源码分析(BLEI)
基本介绍: topic model,主题模型介绍:http://www.cnblogs.com/lixiaolun/p/4455764.html 以及 (http://blog.csdn.net/h ...
- 微信/易信公共平台开发(四):公众号调试器 (仿真微信平台,提供PHP源码)
开发微信/易信公共平台时,调试往往很麻烦,一般只能在手机上边试边改, 或在服务器写日志.当你的服务器脚本有Bug时,手机上没有显示,追查是不容易的.我在开发过程中,编写了一个调试器, 能仿真微信/易信 ...
- Objective-C中3种枚举比较及KVC两个小技巧
Objective-C中3种枚举比较及KVO两个小技巧 一:oc的3种枚举 for循环 for in 枚举块 如代码 NSUInteger totalCount = 10000; NSMutableA ...
- JSTL核心标签
JSTL 核心标签库标签共有13个,功能上分为4类: 1.表达式控制标签:out.set.remove.catch 2.流程控制标签:if.choose.when.otherwise 3.循环标签:f ...
- 【Linux】nl命令
用途 nl主要用于输出行号,但是与cat -n不太一样的是,可以自定义输出行号的样式 全称 nl的全称为:Number of Lines 参数 -b :指定行号指定的方式,主要有2种: -b a :表 ...
- Python的ipython的安装
IPython是Python 的原生交互式 shell 的增强版,可以完成许多不同寻常的任务,比如帮助实现并行化计算:主要使用它提供的交互性帮助,比如代码着色.改进了的命令行回调.制表符完成.宏功能以 ...
- C#:Application操作(待补充)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- Python 爬虫实例(5)—— 爬取爱奇艺视频电视剧的链接(2017-06-30 10:37)
1. 我们找到 爱奇艺电视剧的链接地址 http://list.iqiyi.com/www/2/-------------11-1-1-iqiyi--.html 我们点击翻页发现爱奇艺的链接是这样的 ...
- RESTful风格的SSM框架搭建
1 使用idea编辑工具,maven项目构建工具搭建RESTful风格的java项目 2 进行项目配置 2.1 pom文件依赖 <project xmlns="http://maven ...
- c++创建一个char数组
char c[] = { 'a', 'b', 'c', '\0' }; char* cp = c; printf(cp); 所有的char类型都以'\0'结尾