codeforces724C. Ray Tracing(扩展欧几里得详解)
来源:互联网 发布:奥尼尔身体数据 编辑:程序博客网 时间:2024/05/08 13:42
y = y0 – (a/gcd)*t 证明如下:
由于
ax+by = ax0+by0
所以
a(x-x0) = -b(y-y0) = P
所以
a|P,b|P(“|”表示整除关系)
因为a,b互素,所以
ab|P
即
P=kab
所以
x-x0=kb,y-y0=-ka
整理得到
x=x0+kb,y=y0-ka
将等式两边同时乘以整数k,即a*x*k+b*y*k=gcd(a,b)*k。如果c mod gcd(a,b)=f,则0<=f<gcd(a,b)。
那么可以令c=gcd(a,b)*k+f。这样一来,就有a*x*k+b*y*k+f=c。
若f 0,由于f<gcd(a,b)<=a<=b(假设a<=b),所以不存在f=a*m(m为整数),也就不存在a*(x*k+m)+b*y*k=c。也就是说,不存在a*x+b*y=c的整数解x与y。
所以f=0,即只有当c mod gcd(a,b)=0时,a*x+b*y=c有正整数解。得证。
在找到x * a+y * b = Gcd(a, b)的一组解x0,y0后,可以
得到x * a+y * b = c的一组解x1 = x0*(c/Gcd(a,b)),y1 = y0*(c/Gcd(a,b)),则x * a+y * b = c的其他整数解满足:
x = x1 + b/Gcd(a, b) * t
y = y1 - a/Gcd(a, b) * t(其中t为任意整数)
x 、y就是x * a+y * b = c的所有整数解。
将其化为a=c+mx,b=c+ny,作差得
mx-ny=a-b,从而化为线性不定方程利用扩展欧几里得定理解决。
模m乘法逆元:
定义:对于整数a,m,如果存在整数b,满足ab ≡ 1(mod m),则说,b是a的模m乘法逆元。
定理:a存在模m的乘法逆元的充要条件是gcd(a,m) = 1
证明:充分性:
因为
gcd(a,m) = 1
根据欧拉定理,有
a^φ(m) ≡ 1(mod m)
因此
a * a^(φ(m)-1) mod m = 1
所以存在a的模m乘法逆元,即a^(φ(m)-1)
必要性:
假设存在a模m的乘法逆元为b,则
ab ≡ 1 (mod m)
所以
ab = km +1
所以
1 = ab - km
由欧几里得定理,有
gcd(a,m) = 1
由定理知:
对于ax + my = 1,可以看出x是a模m的乘法逆元,y是m模a的乘法逆元。
反过来,要计算a模m的乘法逆元,就相当于求ax + my = 1的x的最小正整数解,从而化为线性不定方程解决。
下面是如何求解最小正整数解(转):一般,我们能够找到无数组解满足条件,但是一般是让你求解出最小的那组解,怎么做?我们求解出来了一个特殊的解 x’ 那么,我们用 x' % m其实就得到了最小的解了(更广泛情况应为x0%(m/gcd))。为什么?
可以这样思考:
x 的通解不是 x' + m*t (t为任意整数)吗?(更广泛情况应为x0+(m/gcd)*t)(个人理解:x的通解可以由任何特解表示出来,因此也可以用最小正整数特解表示出来,假设最小正整数解为x0,则x=x0+m*t,那么x’=x0+m*t)
那么,也就是说, a 关于 m 的所有逆元是关于 m 同余的,那么根据最小整数原理,一定存在一个最小的正整数,它是 a 关于m 的逆元,而最小的逆元肯定是在(0 , m)之间的,而且只有一个,这就好解释了(更广泛情况应为a 关于 m 的所有逆元是关于 m/gcd 同余的,因为x%(m/gcd)==x0,x为a的任意逆元,x0为最小正整数解,x0在(0,m/gcd)之间,括号外面最后一句话解释了x0的存在性且唯一性)
。
可能有人注意到了,这里,我写通解的时候并不是 x0 + (m/gcd)*t ,但是想想一下就明白了,gcd = 1,所以写了跟没写是一样的,但是,由于问题的特殊性,有时候我们得到的特解 x0 是一个负数,还有的时候我们的 m 也是一个负数这怎么办?
当 m 是负数的时候,我们取 m 的绝对值就行了,当 x0 是负数的时候,他模上 m 的结果仍然是负数(在计算机计算的结果上是这样的,虽然定义的时候不是这样的),这时候,我们仍然让 x0 对abs(m) 取模,然后结果再加上abs(m) 就行了,于是,我们不难写出下面的代码求解一个数 a 对于另一个数 m 的乘法逆元:
下面附上本题代码:
以上内容部分转载于:http://blog.csdn.net/synapse7/article/details/9901195;百度百科;http://blog.csdn.net/zhjchengfeng5/article/details/7786595
- codeforces724C. Ray Tracing(扩展欧几里得详解)
- codeforces724C. Ray Tracing(扩展欧几里得详解)
- codeforces724c Ray Tracing(扩展欧几里得)
- Codeforces 724C Ray Tracing 扩展欧几里得
- CodeForece 724C Ray Tracing 扩展欧几里得
- Ray Tracing(扩展欧几里得,ax+by=c最小解)
- ☆ Codeforces 724C Ray Tracing 扩展欧几里得 + 计算几何
- cf 724CRay Tracing(扩展欧几里得)
- Intel Code Challenge Final Round C. Ray Tracing 拓展欧几里得或模拟 (好题)
- codefoces 724 c Ray Tracing (扩展欧几里德)
- 射线追踪(ray tracing)
- Ray Tracing
- Ray Tracing
- 扩展欧几里得2(详解)
- 扩展欧几里得算法详解
- 扩展欧几里得算法详解
- 扩展欧几里得算法详解
- 扩展欧几里得算法详解
- usb协议
- IOS Https适配摸索
- cpp代码记录1
- hadoop
- 支付宝五(图片视频素材上传)
- codeforces724C. Ray Tracing(扩展欧几里得详解)
- 较常用的Java实用类库
- 递归遍历某个文件夹(包括子文件)中的左右内容
- MySQL数据库的导入与导出,及其他相关命令
- Servlet入门
- synchronized和volatile
- 【C#】56. .Net中的并发集合——ConcurrentStack
- SQL Developer的使用技巧
- 2016.12.09回顾 dataframe获取某一个值的索引