嗯...

题目链接:https://www.luogu.org/problem/P1082

这道题很明显涉及到了同余和exgcd的问题,下面推导一下:

首先证明有解情况:

    ax + by = m有解的必要条件是 m mod gcd(a, b) = 0

    a为gcd(a, b)的倍数,b为gcd(a, b)的倍数,x、y为整数,

    所以ax + by是gcd(a, b)的倍数,所以m是gcd(a, b)的倍数

然后证明a、b互质(下面会用到):

    本题中1 mod gcd(a, b) = 0,所以gcd(a, b)  = 1,所以a、b互质

同余:

    a≡b(mod n) --> 含义:a和b关于模n同余,即 a mod n = b mod n。

    所以不难推出,a≡b的充要条件是a-b是n的整数倍(a > b)。

    因为a-b是n的整数倍,所以a-b = ny(y为倍数)

所以,根据同余,我们可以把本题中的同余式转化为(注:这里的a.b与上文不同):

    ax≡1(modb)  --> ax % b = 1 % b --> ax - 1 = by --> ax - by = 1

下一步,便进行exgcd(关于exgcd的证明见:https://www.luogu.org/problemnew/solution/P1082),分别求出ax - by = 1中x和y的值。

最后进行答案处理:

    因为答案要求是x的最小正整数,所以我们进行一个答案处理:x = (x % b + b) % b

证明其正确性:

    设新得到的x为xn,x = kb + q(q < b)则:

    x % b = q ,把x % b = q带入 xn = (x % b + b) % b,得

    xn = (x % b + b) % b = (q + b) % b = (q % b + b % b) % b = q % b = q

     把xn = q带入x = kb + q,得,x = kb + xn, 所以xn = x - kb,然后再根据下面的推导得知它是正确的...

证明:    

    x批量地减去或加上 b,能保证 ax + by = ax + by = 1:

    ax + by = 1

    ax + by + k*ba - k*ba = 1

    a (x + kb) + (y - ka) b = 1

    1.显然这并不会把方程中任何整数变成非整数。

    2.“加上或减去 b”不会使 x 错过任何解。可以这么理解:

    已经求出一组整数 x,y 使得 ax+by =1 ,也就是(1 - ax) / b = y。y 是整数,可见目前 1−ax 是 b 的倍数。现在想改变 x并使得方程仍然成立。

    已知 a,b 互质,假若x的变化量Δx不是b的倍数,则1−ax 的变化量−a*Δx也不是 bb 的倍数,这会使得1-ax不再是b的倍数,则y不是整数了。

    仅当x的变化量是b的倍数时,1−ax能保持自己是b的倍数,此时就出现新的解了。

AC代码:

  1. #include<cstdio>
  2. #include<iostream>
  3.  
  4. using namespace std;
  5. //ax % b == 1 % b --> ax - 1 = y * b --> ax - yb == 1
  6.  
  7. long long d, x, y;
  8.  
  9. inline void exgcd(long long a, long long b, long long &d, long long &x, long long &y){
  10. if(!b) {d = a; x = ; y = ;}
  11. else{ exgcd(b, a % b, d, y, x); y -= x * (a / b);}
  12. }
  13. int main(){
  14. long long a,b;
  15. scanf("%lld%lld", &a, &b);
  16. exgcd(a, b, d, x, y);
  17. x = (x % b + b) % b;
  18. printf("%lld", x);
  19. return ;
  20. }

AC代码

洛谷 P1082 同余方程(同余&&exgcd)的更多相关文章

  1. 洛谷——P1082 同余方程

    P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...

  2. 洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]

    P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输 ...

  3. 洛谷 P1082 同余方程 —— exgcd

    题目:https://www.luogu.org/problemnew/show/P1082 用 exgcd 即可. 代码如下: #include<iostream> #include&l ...

  4. 洛谷 P1082 同余方程(exgcd)

    题目传送门 解题思路: 因为推导过程过于复杂,懒得写,所以题解传送门 AC代码: #include<iostream> #include<cstdio> using names ...

  5. [NOIP2012] 提高组 洛谷P1082 同余方程

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

  6. 洛谷P1082 同余方程

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

  7. 洛谷 P1082 同余方程

    题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正 ...

  8. 洛谷P1082 同余方程 题解

    题目链接:https://www.luogu.com.cn/problem/P1082 题目大意: 求关于 \(x\) 的同余方程 ax≡1(mod b) 的最小正整数解. 告诉你 \(a,b\) 求 ...

  9. 洛谷 P1082 同余方程 题解

    每日一题 day31 打卡 Analysis 题目问的是满足 ax mod b = 1 的最小正整数 x.(a,b是正整数) 但是不能暴力枚举 x,会超时. 把问题转化一下.观察 ax mod b = ...

随机推荐

  1. MySQL性能优化---优化方案

    1.对查询进行优化,应尽量避免全表查询,首先考虑在where及order by涉及的列上建立索引: 2.应尽量避免where子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描: ...

  2. Blocked Billboard II

    前言 今天比赛真的状态不好(腐了一小会),导致差点爆0. 这个题解真的是在非常非常专注下写出来的,要不然真的心态崩. 刚换了域名,发现了美化脚本的bug,有点担心(汗-_-||). 题目 题目描述 奶 ...

  3. HTML前端入门归纳——样式

    本人一直在从事.net的开发,界面都是采用的WPF,近期花了一个多月进行HTML前端的学习,在这里呢进行学习总结和归纳. 本系列将主要分为4个模块: 控件 样式 布局 JavaScript 根据多年W ...

  4. Java - 字符串操作

    字符串常用操作如下 public static void main(String[] args) { /** * 创建字符串 */ String s1="zifuchuan123" ...

  5. java项目上有个红色感叹号(在project Explorer视图下)

    启动项目时一直报错,检查也没问题,最后看到项目上有个红色感叹号,发现是jar包路径不对,把错误路径的jar包移除,然后再重新添加即可.

  6. Qt QQuickView设置成无边框无标题栏

    #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQuickView> ...

  7. 你了解getBoundingClientRect()?

    理解:getBoundingClientRect用于获取某个元素相对于视窗的位置集合.集合中有top, right, bottom, left等属性. 1.语法:这个方法没有参数. rectObjec ...

  8. 【C语言】用指针描述数组,实现选择法排序

    #include <stdio.h> int main() { ], t; int i, j, max; printf("请输入10个数:\n"); ; i <= ...

  9. 【常见浏览器的UA】

    "所谓 UA(User Agent / 用户代理),最初是指浏览器告知网站管理员,本浏览器支持的类型和框架,让网站管理员以支持的模式结构向浏览器发送页面,呈现给用户浏览.演变到今天,网站管理 ...

  10. malloc实现机制

    使用过c语言的都知道malloc是一个动态分配内存的函数,还可以通过free释放内存空间. 如果我们想分析一下malloc的源码,这其实不是一会就能看懂的,但是我们可以讨论一下malloc的简单实现. ...