嗯...

题目链接: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 = 1; y = 0;}
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 0;
20 }

AC代码

转载于:https://www.cnblogs.com/New-ljx/p/11261791.html

洛谷 P1082 同余方程(同余exgcd)相关推荐

  1. 洛谷P1082 同余方程 数论

    洛谷P1082 同余方程 数论 要求 ax === 1 (mod b) 相当于求 ax + by == 1 的解 并要求 x 为最小的正整数 这样我们只要 扩展欧几里德来一发,然后最小正整数 取 mo ...

  2. 洛谷 1226 取余运算||快速幂

    洛谷  取余运算||快速幂 1226 其实比起楼下的大佬们,我主要是多了些位运算和讲解. 想法一: 直接输出 pow(b,q)%k 嗯~~勇气可嘉,但是看一眼数据范围(长整型)就会意识到,这个方法也许 ...

  3. 快速幂||取余运算【模板】(洛谷P1226题题解,Java语言描述)

    题目要求 P1226题目链接 分析 标准的快速幂取模算法板子,之前这个算法我在这篇文章中讲过了:<快速幂算法详解&&快速幂取模算法详解>. 这里选择使用比较简单的API实现 ...

  4. 洛谷 - 试炼场(全部题目备份)

    整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...

  5. java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...

    点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...

  6. 【c++算法刷题笔记】——洛谷2

    1. 洛谷练习--P1579 哥德巴赫猜想(升级版) 题目描述: 现在请你编一个程序验证哥德巴赫猜想. 先给出一个奇数n,要求输出3个质数,这3个质数之和等于输入的奇数. 输入格式: 仅有一行,包含一 ...

  7. 信息学奥赛一本通 2004:【20CSPJ普及组】优秀的拆分 | 洛谷 P7071 [CSP-J2020] 优秀的拆分

    [题目链接] ybt 2004:[20CSPJ普及组]优秀的拆分 洛谷 P7071 [CSP-J2020] 优秀的拆分 [题目考点] 数制 基数:即进制数.十进制的基数是10,二进制的基数是2. 按位 ...

  8. 信息学奥赛一本通 1962:【13NOIP普及组】表达式求值 | 洛谷 P1981 [NOIP2013 普及组] 表达式求值

    [题目链接] ybt 1962:[13NOIP普及组]表达式求值 洛谷 P1981 [NOIP2013 普及组] 表达式求值 [题目考点] 栈 中缀表达式转后缀表达式,后缀表达式求值 中缀表达式求值 ...

  9. 模拟——玩具谜题(洛谷 P1563)

    模拟算法指的是让程序完整地按照题目叙述的方式运行得到答案! 此题选自洛谷P1563 简单的模拟,类似约瑟夫问题的部分,采用取余的方式. 需要注意的是朝向问题,用一个结构体来保存每个人的朝向即可. 题目 ...

最新文章

  1. 卫星覆盖分析传感器类型
  2. 【论文阅读----DDI(1)】MUFFIN: multi-scale feature fusion for drug–drug interaction prediction
  3. java concurrenthashmap与阻塞队列
  4. vtuber面部捕捉工具_泰国程序员开发VTuber形象生成系统,人人都能当虚拟偶像
  5. A wizard’s guide to Adversarial Autoencoders: Part 1, Autoencoder?
  6. react 生命挂钩_如何在GraphQL API中使用React挂钩来管理状态
  7. 4x4矩阵键盘工作原理及扫描程序_单片机人机交互矩阵按键
  8. 什么是ETL?一文掌握ETL设计过程
  9. mysql 四叉树的应用_游戏算法(2):查找优化之四叉树的应用
  10. Topsky酒店管理系统v1.4.2.3
  11. 精通python工资高吗-2020年10月程序员工资再创新高
  12. 查找算法之二 二分查找(C++版本)
  13. php未定义常量破解,如何使PHP未定义的常量注意到错误
  14. 《App后台开发运维和架构实践》前言
  15. lsyncd搭建和使用(含rsync配置)
  16. 不积跬步,无以至千里 small tips
  17. java毕业设计青岛滨海药店管理系统的设计与实现源码+lw文档+mybatis+系统+mysql数据库+调试
  18. 扶不起的优酷,做不好的阿里大文娱,路远!
  19. android之broadcastreceiver 耳机按键,Android 实时监听耳机按钮事件
  20. 数字字符串位数不足左边补零

热门文章

  1. gperf的学习笔记(一)
  2. 流程控制之for循环
  3. RabbitMQ中的消息不可达returnlistener和mandatory的使用
  4. 学习Linux的第十一课时
  5. 仿苹果通知显示在图标右上角上
  6. 一个java处理JSON格式数据的通用类(四)
  7. 回到顶部和返回首页jquery插件
  8. 挨踢人生路--记我的10年18家工作经历 - 第16家公司,英国公司――第一次当经理...
  9. linux基本知识点学习
  10. python获取按键状态_谁在用 python 弹奏一曲菊花台