我们先放题面——

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. docsify + Gitee Pages服务搭建开源项目网站

    前言 base-admin从开源至今,已经收获了2k Stat,而我们一直都没有一份像样的在线文档,最近写了一个博客园随笔备份Java脚本,将博客随笔备份到本地,格式是md文档格式,就有意去找将md文 ...

  2. jsonp和cors解决跨域

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.对于JSON大家应该是很了解了吧,不是很清楚的朋友可以去json.org上了解下,简单易懂. 1.什么是跨 ...

  3. Android系统编程入门系列之应用权限的定义与申请

    在之前关于应用内数据本地保存为文件时,曾提到应用需要申请外部存储设备的读写权限才能访问外部存储中的文件.那么针对某一种权限,应用程序具体应该怎么申请使用呢?本文将详细介绍. 应用中的权限主要分为两类, ...

  4. 【UE4 C++】 获取Actor、Controller、Pawn、Character

    获取 Actor TActorIterator 遍历 可以用于遍历 Actor,也可以用于遍历 Component for (TActorIterator<AStaticMeshActor> ...

  5. 【数据结构与算法Python版学习笔记】树——利用二叉堆实现优先级队列

    概念 队列有一个重要的变体,叫作优先级队列. 和队列一样,优先级队列从头部移除元素,不过元素的逻辑顺序是由优先级决定的. 优先级最高的元素在最前,优先级最低的元素在最后. 实现优先级队列的经典方法是使 ...

  6. Java:LinkedList类小记

    Java:LinkedList类小记 对 Java 中的 LinkedList类,做一个微不足道的小小小小记 概述 java.util.LinkedList 集合数据存储的结构是循环双向链表结构.方便 ...

  7. Java High Level REST Client 使用地理位置查询

    Java High Level REST Client 使用地理位置查询 一.需求 二.对应的query语句 三.对应java代码 1.引入 jar 包 2.创建 RestHighLevelClien ...

  8. STM32必学的时钟系统

    STM32的时钟系统 相较于51单片机,stm32的时钟系统可以说是非常复杂了,我们现在看下面的一张图:   上图说明了时钟的走向,是从左至右的从时钟源一步步的分配给外设时钟.需要注意的是,上图左侧一 ...

  9. clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused)

    clnt_create: RPC: Port mapper failure - Unable to receive: errno 111 (Connection refused) 关闭防火墙,可以连, ...

  10. 创建双向 CA x509 验证证书 kube-apiserver

    1. 设置 kube-apiserver 的 CA 证书相关的文件和启动参数 使用 OpenSSL 工具在 Master 服务器上创建 CA 证书和私钥相关的文件: # openssl genrsa ...