Mail.Ru Cup 2018 Round 2 Problem C Lucky Days

设在第 x 天二人都 lucky,则有
$ x = y_a t_a + R_a x= y_b t_ b + R_b$

约束条件:
$ l_a \le R_a \le r_al_b \le R_b \le r_b y_a, y_b \ge 0$

写成同余方程组

{xRa(modta)xRb(modtb)

x0 是上述同余方程组的一个特解,则其通解可表为 x=x0+klcm(ta,tb)kZ

容易证明,同余方程组

{xr1(modm1)xr2(modm2)
有解的充要条件是 gcd(m1,m2)(r1r2),此充要条件亦可写成 r2=r1+kgcd(m1,m2),kZ,或者写成 r1r2(modgcd(m1,m2))

解法:二分答案。
实现:http://codeforces.com/contest/1055/submission/45569689

总结

求解形如
(1){xa1(modm1)xa2(modm2)xan(modmn)
的同余方程组。

考虑两个方程构成的同余方程组
(2){xa1(modm1)xa2(modm2)

(3){x=m1s+a1x=m2t+a2
s,t 满足方程
(4)m1s+a1=m2t+a2
根据裴蜀定理,(4) 有解的充要条件是 gcd(m1,m2)(a1a2) 。以下假设此条件成立,并令 d=gcd(m1,m2)(4) 亦可写成
(5)m1s=m2t+(a2a1)
方程 (5) 等价于
(6)m1sa2a1(modm2)
注意:一个不定方程等价于一个同余方程。要熟悉这两种形式的相互转化。
方程 (6) 又等价于
(7)m1dsa2a1d(modm2d)
解得
s(m1d)1a2a1d(modm2d)
其中 (m1d)1 表示 m1d 在模 m2d 下的逆元,可用扩展欧几里得算法求得。令 b=(m1d)1a2a1d,有
(8)s=km2d+b
(8) 代入 (3),得
(9)x=km1m2d+m1b+a1

(10)xm1b+a1(modm1m2d)
至此,我们将同余方程组 (2) 化成了等价(同解)的同余方程 (10)

我们证明了

(2) 有解,则其在模 lcm(m1,m2) 下有唯一解 x0

故可用 xx0(modlcm(m1,m2)) 取代 (1) 中的前两个方程,不断如此操作,最后将得到 xa(modlcm(a1,a2,,am)),这样就得到了 (1) 的通解,也意味着

(1) 有解,则其在模 lcm(m1,m2,,mn) 下有唯一解。

后记

Miskcoo 的文章(4) 的特解和通解入手证明了 (3) 在模 lcm(m1,m2) 下有唯一解,其思路更为简洁。

用扩展 Euclid 算法求出 (4) 的特解 s,t,即可得到 (3) 的特解 x0=sm1+a1,然后用 xx0(modlcm(m1,m2)) 替换 (1) 中的前两个方程。

Reference

https://blog.csdn.net/qq_29980371/article/details/71053219

http://blog.miskcoo.com/2014/09/chinese-remainder-theorem

posted @   Pat  阅读(363)  评论(0编辑  收藏  举报
编辑推荐:
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
阅读排行:
· 2025成都.NET开发者Connect圆满结束
· 在 VS Code 中,一键安装 MCP Server!
· 后端思维之高并发处理方案
· langchain0.3教程:从0到1打造一个智能聊天机器人
· 千万级大表的优化技巧
历史上的今天:
2016-11-12 UOJ #149 [NOIP 2015] 子串
点击右上角即可分享
微信分享提示