同余运算及其基本性质

取模:

a%b b定是正整数,尽管语言上b<0合法。/b=0出现除0错 

(a+b)mod n=((a mod n)+(b mod n)) mod n

(a-b)mod n=((a mod n)-(b mod n)+n)mod n     //注意减法, a mod n 可能小于 b mod n 结果需加上n

ab mod n=(a mod n)(b mod n)mod n

注意乘法,注意(a mod n)(b mod n)是否会溢出,用long long 保存中间结果

1 int mul_mod(int a,,int b,int n)
2 {
3     a%=n;b%=n;
4     return (int)((long long)a*b%n);
5 }

除法不可直接取模,用到乘法逆元

同余运算:

若(a-b)%m==0,就称a,b关于m同余/a,b对模数m同余

e.g. (100-60)%8==0,我们就说100和60对于模数8同余

它的另一层含义就是说,100和60除以8的余数相同。

a和b对m同余,我们记作a≡b(mod m)

你会发现这种记号到处都在用,比如和数论相关的书中就经常把a mod 3 = 1写作a≡1(mod 3)

性质:

如果a≡b(mod m),x≡y(mod m),则a+x≡b+y(mod m)//两边分别相加也是
如果a≡b(mod m),x≡y(mod m),则ax≡by(mod m)//两边分别相乘也是
如果ac≡bc(mod m),且c和m互质,则a≡b(mod m)//c,m互质时,去掉c也是

模线性方程组:

输入正整数a,b,n 解方程ax≡b(mod n).a,b,n<=10^9

方程可理解为ax-b是n的正整数倍,设倍数为y,则ax-b=ny;即ax-ny=b  解此不定方程----扩展欧几里得算法

同余方程的解是一个同余等价类

b=1时,ax≡1(mod n)的解称a关于模n的逆invers----乘法逆元

有解条件,a,n互质gcd(a,n)=1,此时,方程只有唯一解

时间: 2024-08-02 09:15:32

同余运算及其基本性质的相关文章

C语言负数的除法和求余运算

假定我们让 a 除以 b,商为 q,余数为 r: q = a / b; r = a % b; 这里,不妨假定 b 大于 0. 我们希望 a.b.q.r 之间维持怎样的关系呢? 1.最重的一点,我们希望 q * b + r == a,因为这是定义余数的关系. 2.如果我们改变 a 的正负号,我们希望这会改变 q 的符号,但这不会改变 q  的绝对值. 3.当 b>0 时,我们希望保证 r >= 0 且 r < b.例如,如果余数用于哈希表的索引,确保 它是一个有效的索引值很重 . 这三条性

【分治】取余运算

问题 E: [分治]取余运算 时间限制: 1 Sec  内存限制: 128 MB提交: 16  解决: 6[提交][状态][讨论版] 题目描述 输入b,p,k的值,求bp mod k的值.其中b,p,k*k为长整型数. 输入 三个整数,分别为b,p,k的值 输出 bp mod k 样例输入 2 10 9 样例输出 2^10 mod 9=7 提示 解题思路:分治,顾名思义,把一个大问题分解为多个小问题. 这里有一个公式,利用这个公式通过递归求得. 代码: #include <iostream>

wikioi 1497--求余运算

题目描述:给定b,p,k要求(b^p)%k 思路:主要是快速求幂运算,有递归和非递归两种思路. 递归有错误,应该是溢出问题 #include <iostream> #include <queue> #include <climits> #include <algorithm> #include <memory.h> #include <stdio.h> #include <ostream> #include <vec

Luogu P1226 取余运算||快速幂(数论,分治)

P1226 取余运算||快速幂 题目描述 输入b,p,k的值,求b^p mod k的值.其中b,p,k*k为长整型数. 输入输出格式 输入格式: 三个整数b,p,k. 输出格式: 输出"b^p mod k=s" s为运算结果 输入输出样例 输入样例#1: 2 10 9 输出样例#1: 2^10 mod 9=7 这是一道很有趣的水题,如果知道公式. 一般求解会溢出,导致答案错误. 这里介绍取模的一个公式: a*b%k=(a%k)*(b%k)%k. 在我们这道题中是b^p = (b^(p/

分治2--取余运算

分治2--取余运算 一.心得 二.题目和分析 题目描述 输入b,p,k的值,求bp mod k的值.其中b,p,k*k为长整型数. 输入 三个整数,分别为b,p,k的值 输出 bp mod k 样例输入 2 10 9 样例输出 2^10 mod 9=7 提示 解题思路:分治,顾名思义,把一个大问题分解为多个小问题. 这里有一个公式,利用这个公式通过递归求得. 三.代码和结果 1 /* 2 递推方程 3 边界 4 p==0 1 5 p/2==0 f(p)=f(p/2)*f(p/2) 6 p/2==

codevs 1497取余运算

1497 取余运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamon 题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k为长整型数(2^31范围内). 输入描述 Input Description b p k 输出描述 Output Description 输出b^p mod k=? =左右没有空格 样例输入 Sample Input 2  10  9 样例输出 Sample Output 2^10 mod

1497 取余运算

1497 取余运算 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 输入b,p,k的值,编程计算bp mod k的值.其中的b,p,k*k为长整型数(2^31范围内). 输入描述 Input Description b p k 输出描述 Output Description 输出b^p mod k=? =左右没有空格 样例输入 Sample Input 2  10  9 样例输出 Sample Outp

[转]取模运算和求余运算的区别

[转]取模运算和求余运算的区别 通常情况下取模运算(mod)和求余(rem)运算被混为一谈,因为在大多数的编程语言里,都用'%'符号表示取模或者求余运算.在这里要提醒大家要十分注意当前环境下'%'运算符的具体意义,因为在有负数存在的情况下,两者的结果是不一样的. 对于整型数a,b来说,取模运算或者求余运算的方法都是: 1.求 整数商: c = a/b; 2.计算模或者余数: r = a - c*b. 通常常用的是正数之间取模或求余.下面的可以先不关心. —————————————————————

java学习日记-基础-随机数组的求余运算

时间是2017年5月6日,青年节刚过,坐标上海,沪漂2个月. 就这样简短地开始吧.                                by:slowcity [案例分析1] 要求定义一个int 型数组a,包含100 个元素,保存100个随机的4 位数.再定义一个int 型数组b,包含10 个元素.统计a 数组中的元素对10 求余等于0 的个数,保存到 b[0]中:对10 求余等于1 的个数,保存到b[1]中,--依此类推 一般看到这类的最基本的思路:1先建立一个含数组存随机四位数 2