[Noip 2012]同余方程(线性同余方程)
我们先放题面——
RT就是求一个线性同余方程ax≡1(mod b)的最小正整数解
我们可以将这个同于方程转换成这个方程比较好理解 ax=1+bn(n为整数
我们再进行一个移项变为ax-bn=1 我们设-n为y
那么这个方程就变成了ax+by=1这一个不定方程
我们可以完全可以先解出这一个方程的一个特解x0,y0(解法下面讲)
因为我们求解出的特解有可能会大于我们最后的答案也有可能小于我们最后的答案(为负数)
这个时候我们需要一个性质——
若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。
证明:
该方程等价于ax + by = c,如果有解,两边同除以d,就有a/d * x + b/d * y = c/d,即a/d * x ≡ c/d (mod b/d),显然gcd(a/d, b/d) = 1,所以由一知道x在[0, b/d - 1]上有唯一解。所以ax + by = c的x在[0, b/d - 1]上有唯一解,即ax ≡ c (mod b)在[0, b/d - 1]上有唯一解,得证!
如果得到ax ≡ c (mod b)的某一特解X,那么我令r = b/gcd(a, b),可知x在[0, r-1]上有唯一解,所以x = (X % r + r) % r就可以求出最小非负整数解x了!X % r可能是负值,此时保持在[-(r-1), 0]内,正值则保持在[0, r-1]内。加上r就保持在[1, 2r - 1]内,所以再模一下r就在[0, r-1]内了。
又因为——对于不定方程ax+by=n来说,唯有gcd(a,b)|n时才有答案,又因为对于这题来说n=1,所以gcd(a,b)只能是1(也就是a,b互质)
所以答案就是(x0%b+b)%b;
于是我们只要能求解ax+by=1这个方程的特解就可以了
我们使用扩展欧几里得算法
回忆我们欧几里得算法求gcd的方法
gcd(a,b)=gcd(b,a%b)(b!=0);
a(b==0)
我们通过递归来求。
我们可以使用同样的方法将我们的不定方程 ax+by=gcd(a,b)(本题就是1啦)变为bx+(a%b)y=gcd(b,a%b)=gcd(a,b)
我们将a%b变为a-a/b*b(‘/’为整除答案)
所以也就变为了bx+(a-a/b*b)y=ay+b(x-a/b*y)
所以我们只要解bx+(a%b)y这个方程的解x1,y1就可以得到ax+by的解x=y1,y=x1-a/b*y1
所以我们也可以递归到b=0时 x就等于1 然后一直逆推回答案
假如ax+by!=gcd(a,b)呢(这里已经与本题无关了)
我们设ax+by=c 设gcd(a,b)=d 如果d|c
我们可以通过上面的方法求出a(x*(d/c))+b(y*(d/c))=d的一个特解;
再将特解除以d/c也就是乘c/d
假如d|c不成立的话 那么就没有以上过程 所以当gcd(a,b)不整除c时该不定方程无解
所以我们再回到这道题,我们只要使用扩展欧几里得求ax+by=1的一组特解再用(x0%b+b)%b作为答案就好啦!
贴代码——
1 #include<iostream>
2 #include<cstdio>
3 #include<algorithm>
4 using namespace std;
5 long long a,b;
6 long long x,y;
7 void exgcd(long long a,long long b)
8 {
9 if(b==0)
10 {
11 x=1;
12 y=0;
13 return ;
14 }
15 else
16 exgcd(b,a%b);
17 long long x1=x;
18 x=y;
19 y=x1-a/b*y;
20 }
21 int main()
22 {
23 scanf("%lld%lld",&a,&b);
24 exgcd(a,b);
25 printf("%lld",(x%b+b)%b);
26 }
同余方程
(好了,本篇题解就到这里了,慢走)
(有什么不懂可以加qq2733524923我们一起探讨哦)QWQ
[Noip 2012]同余方程(线性同余方程)的更多相关文章
- POJ2115:C Looooops(一元线性同余方程)
题目: http://poj.org/problem?id=2115 要求: 会求最优解,会求这d个解,即(x+(i-1)*b/d)modm;(看最后那个博客的链接地址) 前两天用二元一次线性方程解过 ...
- 数论 - n元线性同余方程的解法
note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m ...
- POJ2115 C Looooops(线性同余方程)
无符号k位数溢出就相当于mod 2k,然后设循环x次A等于B,就可以列出方程: $$ Cx+A \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} ...
- POJ1061 青蛙的约会(线性同余方程)
线性同余方程$ ax \equiv b \pmod n$可以用扩展欧几里得算法求解. 这一题假设青蛙们跳t次后相遇,则可列方程: $$ Mt+X \equiv Nt+Y \pmod L$$ $$ (M ...
- POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)
分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转 ...
- poj2115-C Looooops -线性同余方程
线性同余方程的模板题.和青蛙的约会一样. #include <cstdio> #include <cstring> #define LL long long using nam ...
- 扩展欧几里得,解线性同余方程 逆元 poj1845
定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b) int exgcd(int a,int b,int &x,int &y){ ){x=,y=;return ...
- POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]
先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/68 ...
- HDU3579:Hello Kiki(解一元线性同余方程组)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lc ...
随机推荐
- Java:关于 CAS 笔记
Java:关于 CAS 笔记 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 1. CAS 底层原理 概念 CAS 的全称是 Compare-And-Swap,它 ...
- httpclient 登录成功后返回的cookie值访问下一页面
HttpClient4.x可以自带维持会话功能,只要使用同一个HttpClient且未关闭连接,则可以使用相同会话来访问其他要求登录验证的服务(见TestLogin()方法中的"执行get请 ...
- [Beta]the Agiles Scrum Meeting 6
会议时间:2020.5.20 21:00 1.每个人的工作 今天已完成的工作 成员 已完成的工作 issue yjy 帮助成员解决配置环境问题 tq 增加功能:添加多个评测机 评测部分增加更多评测指标 ...
- 阿里Nacos部署
Nacos的部署 一.单机部署 **4.修改 Nacos 存储为 Mysql** 二.集群部署 1.机器部署列表 2.修改 `nacos/conf/application.properties`中的端 ...
- 最小最大堆min-max Heap
(1)由性质5只能插在奇数层,即根节点处,7下沉到右堆的min level,10下沉到max level,插入后满足min-max heap性质,很容易画出: (2)由性质80也是向右堆插入,且插入到 ...
- 深入理解 Linux的进程,线程,PID,LWP,TID,TGID
转载:https://www.linuxidc.com/Linux/2019-03/157819.htm 在Linux的top和ps命令中,默认看到最多的是pid (process ID),也许你也能 ...
- 『动善时』JMeter基础 — 56、JMeter使用命令行模式生成HTML测试报告
目录 1.自动生成HTML图形化报告 2.使用已有的测试结果文件生成HTML报告 3.HTML图形化报告内容详解 (1)Dashboard页面:(重点查看) (2)Charts页面:(辅助分析) 4. ...
- 新手使用python以及pycharm看过来
前言 随着互联网时代的进步,人类与计算机之前的沟通交流越来越便捷,自此交流的媒介--编程语言吸引力更多的人学习,今天我们就来谈谈当前市面上最火的编程语言 1.文件的概念 什么是文件夹.文件 其实是操作 ...
- Python学习路线【对标大厂Python工程师的招聘要求,并推荐优质免费资源】打卡学习不迷茫
您好,我是码农飞哥,感谢您阅读本文,欢迎一键三连哦. 本文要点:从Python爬虫工程师的招聘要求出发制定学习路线,同时还推荐免费优质的学习资源. 打卡学习不迷茫. 干货满满,建议收藏,需要用到时常看 ...
- 《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
1.简介 理想很丰满现实很骨感,在应用selenium实现web自动化时,经常会遇到处理日期控件点击问题,手工很简单,可以一个个点击日期控件选择需要的日期,但自动化执行过程中,完全复制手工这样的操作就 ...