我们先放题面——

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]同余方程(线性同余方程)的更多相关文章

  1. POJ2115:C Looooops(一元线性同余方程)

    题目: http://poj.org/problem?id=2115 要求: 会求最优解,会求这d个解,即(x+(i-1)*b/d)modm;(看最后那个博客的链接地址) 前两天用二元一次线性方程解过 ...

  2. 数论 - n元线性同余方程的解法

    note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念: 形如:(a1*x1+a2*x2+....+an*xn)%m=b%m       ...

  3. POJ2115 C Looooops(线性同余方程)

    无符号k位数溢出就相当于mod 2k,然后设循环x次A等于B,就可以列出方程: $$ Cx+A \equiv B \pmod {2^k} $$ $$ Cx \equiv B-A \pmod {2^k} ...

  4. POJ1061 青蛙的约会(线性同余方程)

    线性同余方程$ ax \equiv b \pmod n$可以用扩展欧几里得算法求解. 这一题假设青蛙们跳t次后相遇,则可列方程: $$ Mt+X \equiv Nt+Y \pmod L$$ $$ (M ...

  5. POJ 2115 C Looooops (扩展欧几里德 + 线性同余方程)

    分析:这个题主要考察的是对线性同余方程的理解,根据题目中给出的a,b,c,d,不难的出这样的式子,(a+k*c) % (1<<d) = b; 题目要求我们在有解的情况下求出最小的解,我们转 ...

  6. poj2115-C Looooops -线性同余方程

    线性同余方程的模板题.和青蛙的约会一样. #include <cstdio> #include <cstring> #define LL long long using nam ...

  7. 扩展欧几里得,解线性同余方程 逆元 poj1845

    定理:对于任意整数a,b存在一堆整数x,y,满足ax+by=gcd(a,b) int exgcd(int a,int b,int &x,int &y){ ){x=,y=;return ...

  8. POJ 1061 - 青蛙的约会 - [exgcd求解一元线性同余方程]

    先上干货: 定理1: 如果d = gcd(a,b),则必能找到正的或负的整数k和l,使ax + by = d. (参考exgcd:http://www.cnblogs.com/dilthey/p/68 ...

  9. HDU3579:Hello Kiki(解一元线性同余方程组)

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=3579 题目解析:求一元线性同余方程组的最小解X,需要注意的是如果X等于0,需要加上方程组通解的整数区间lc ...

随机推荐

  1. Apache Common-collection 反序列化利用链解析--TransformedMap链

    Apache Common-collection 反序列化利用链解析 TransformedMap链 参考Java反序列化漏洞分析 - ssooking - 博客园 (cnblogs.com) poc ...

  2. python和js分别在多行字符串中插入一行字符串

    问题 一个多行字符串,"asfdb;\nwesfpjoing;\nwbfliqwbefpwqufn\nasfdwe\nsafewt\nqwern\nvar\ntgwtg\n\nftwg\n& ...

  3. 【c++ Prime 学习笔记】第19章 特殊工具与技术

    某些程序对内存分配有特殊要求,不能直接使用标准内存管理机制 重载new和delete算符可控制内存分配的过程 19.1.1 重载new和delete 说法"重载new和delete" ...

  4. 第五章第四周习题: Transformers Architecture with TensorFlow

    目录 Transformer Network Packages 1 - Positional Encoding 1.1 - Sine and Cosine Angles Exercise 1 - ge ...

  5. UltraSoft - Alpha - Scrum Meeting 1

    Date: Apr 06th, 2020. 会议内容为讨论功能规格书和技术规格书的撰写. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM.后端 进行Djan ...

  6. NGINX杂谈——flask_limiter的IP获取(怎么拿到真实的客户端IP)

    本篇博客将 flask_limiter 作为切入点,来记录一下自己对 remote_addr 和 proxy_add_x_forwarded_for 两个变量.X-Real-IP 和 X-Forwar ...

  7. stm32直流电机驱动与测速学习总结

    通过实验发现,定时器的一个通道控制一个pwm信号. 在正式开始之前也可以参考这个视频学习资料 (stm32直流电机驱动) http://www.makeru.com.cn/live/1392_1218 ...

  8. AtCoder Beginner Contest 182 F

    F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...

  9. Bzoj通过5题纪念

    我A了五题啦!!!

  10. hdu 2201 熊猫阿波的故事(简单概率。。)

    题意: 阿波上了飞机,飞机上有座位1,2,....,N.第i个乘客本应坐在第i个座位上. 可是阿波随便找了个座位就坐了下来,接下来大家也都随便找了个座位坐了下来. 问:第i个乘客坐到原座位的概率是多少 ...