取模与加减乘除原理,模拟实现代码及相关公式推导

计算(a + b)%N

(a + b)%N = (a % N + b % N) % N

计算(a - b)%N

(a - b)%N = (a % N - b % N) % N

计算(a * b)%N

引入x,y . x = (a % N),y = (b % N)

推导a = t1 * N + x,b = t2 * N + y;

(a * b) % N

= ((t1 * N + x) * (t2 * N + y) ) % N

= (x * y) % N

= ((a % N )*( b % N)) % N

(a * b) % N = ((a % N )*( b % N)) % N

计算(a / b) % N

(a / b) % N = (a * power(b , N - 2) ) % N N必须为质数!!!!

除法写成这样看会舒服一点

除法公式推导

原文链接

分享丨模运算的世界:当加减乘除遇上取模(模运算恒等式/费马小定理/组合数) - 力扣(LeetCode)

实现代码

cpp 复制代码
const int N = 1e9 + 7;
long long quickPowerMod(long long base, long long exponent) {
	long long result = 1; // 初始化结果为1
	base %= N; // 先对底数取模
	while (exponent > 0) {
		if (exponent % 2 == 1) { // 如果指数是奇数
			result = (result * base) % N; // 将当前的底数乘到结果中,并取模
		}
		base = (base * base) % N; // 底数自乘,并取模
		exponent >>= 1; // 指数右移一位(相当于除以2)
	}
	return result;
}
int add(int a, int b) {
	return (a % N + b % N) % N;
}
int sub(int a, int b) {
	return add(a, -b);
}
int mul(int a, int b) {
	return ((a % N) * (b % N)) % N;
}
int divi(int a, int b) {
	return mul(a % N, quickPowerMod(b, N - 2) % N) % N;
}
相关推荐
Proxy_ZZ020 小时前
从零实现LDPC比特翻转译码器:C语言实战与底层逻辑解析
c语言·算法
森G20 小时前
58、最佳实践与注意事项---------多线程、竟态条件和同步
c++·qt
汀、人工智能21 小时前
[特殊字符] 第76课:单词拆分
数据结构·算法·均值算法·前缀树·trie·单词拆分
CheerWWW21 小时前
C++学习笔记——箭头运算符、std::vector的使用、静态链接、动态链接
c++·笔记·学习
Fcy64821 小时前
算法基础详解(五)二分算法——二分查找与二分答案
算法·二分算法
郭涤生21 小时前
原子操作的内存顺序
c++
ALex_zry21 小时前
C++模板元编程实战技巧
网络·c++·windows
SteveSenna21 小时前
强化学习4.1:基于价值——Q-learning
人工智能·学习·算法·机器人
少许极端21 小时前
算法奇妙屋(四十四)-贪心算法学习之路11
java·学习·算法·贪心算法
子琦啊21 小时前
【算法复习】数组与双指针篇
javascript·算法