我们先放题面——

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. flask 之 请求钩子

    请求钩子 什么是请求钩子? 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. f ...

  2. leetcode347 —— n中topK && PriorityQueue(Heap) && Map遍历

    题目要求:求前K个最频繁出现的数字. 1.很容易想到,使用HashMap<Integer,Integer>来存储<number,frequency>键值对 1 int n = ...

  3. 第一次Alpha Scrum Meeting

    本次会议为Alpha阶段第一次Scrum Meeting会议 会议概要 会议时间:2021年4月22日 会议地点:北航Inspiration Space咖啡厅 会议时长:1小时 会议内容简介:本次会议 ...

  4. logstash multi pipeline的使用

    logstash multi pipeline的使用 一.背景 二.解决方案 1.方案一: 2.方案二: 3.方案三: 三.实现步骤 1.编写 pipeline 文件 1.从文件收集,输出到控制台 2 ...

  5. C# 如何将日期格式化ISO8601模式

    类似于这样的时间戳格式:预计来访时间,时间参数需满足ISO8601格式:yyyy-MM-ddTHH:mm:ss+当前时区,例如北京时间:2018-07-26T15:00:00 + 08:00 stri ...

  6. Python 语法错误 except Exception, e: ^ SyntaxError: invalid syntax

    出这个问题是因为python2和python3 语法有些不同 python2 和 3 处理 except 子句的语法有点不同,需要注意: Python2 try: print ("hello ...

  7. 01_WPF概述

    目录 Windows 图形演化 高级API 分辨率无关性 WPF体系结构 我的微信公众号 Windows 图形演化 在 WPF 之前,windows 开发一直使用本质上相同的显示技术.每个传统 win ...

  8. 记一次,因表变量导致SQL执行效率变慢

    场景 最近工作中,发现某同步JOB在执行中经常抛出SQL执行超时的问题,查看日志发现每次SQL执行的时间都是线性增长的,循环执行50次以后执行时间甚至超过了5分钟 JOB执行流程分析  首先,对于JO ...

  9. LINUX系统新增及自动挂载硬盘-九五小庞

    Linux系统下,添加新硬盘后,自动挂载的方法   1,列出所有硬盘,找到需要挂载的硬盘,例如/dev/vdb.输入: fdisk -l   2,查看硬盘是不是已经被挂载.一个硬盘不能重复挂载,已经挂 ...

  10. Linux&C open creat read write lseek 函数用法总结

    一:五个函数的参数以及返回值. 函数                                 参数                      返回值     open (文件名,打开方式以及读 ...