[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 ...
随机推荐
- Hash窃取与传递
Hash窃取与传递 NTHASH(NTLM) 在 Windows中, 存储的密码Hash就叫做 NTHash,也叫做 NTLM,其中NTLM 全称是 "NT LAN Manager" ...
- 如果你还不知道Apache Zookeeper?你凭什么拿大厂Offer!!
很多同学或多或少都用到了Zookeeper,并知道它能实现两个功能 配置中心,实现表分片规则的统一配置管理 注册中心,实现sharding-proxy节点的服务地址注册 那么Zookeeper到底是什 ...
- NOIP模拟83(多校16)
前言 CSP之后第一次模拟赛,感觉考的一般. 不得不吐槽多校联测 OJ 上的评测机是真的慢... T1 树上的数 解题思路 感觉自己思维有些固化了,一看题目就感觉是线段树. 考完之后才想起来这玩意直接 ...
- 【二食堂】Alpha - Scrum Meeting 1
Scrum Meeting 1 例会时间:4.10 8:00 - 8:30 进度情况 组员 上周进度 明日任务 李健 1. 在Anaconda3中搭建了python和django的环境issue1. ...
- BUAA SE | 提问回顾与个人总结
项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾与个人总结 我在这个课程的目标是 深入理解软件工程 这个作业在哪个具体方面帮助我实现目标 ...
- 关于qmake的install
在pro的构建系统中可以设置INSTALLS变量,在make命令之后,执行make install命令触发,将想要的资源拷贝到相应的目录,参考qwt的构建体系,在qwt.pro末尾有这么几句 qwts ...
- linux下使用shell命令通过wpa_cli控制wpa_supplicant连接wifi
最近在调试wifi,已经把wpa_supplicant 工具编译打包好了,为了测试wif驱动及wifi模块是否ok,需要用shell命令临时启动wifi服务连接wifi热点测试. 首先板子启动用ifc ...
- (转)Linux中的文件描述符与打开文件之间的关系
转:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述 在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录文 ...
- 反转单词顺序列 牛客网 剑指Offer
反转单词顺序列 牛客网 剑指Offer 题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但 ...
- SQL注入之猫舍之sqlmap的使用
先说一下最常用的基础指令 -u 指定注入点(一般为url栏的网址) --dbs 跑库名 --tables 跑表名 --columns 跑字段名 --dump 枚举数据(高危指令,容易进去) -D 库名 ...