取模加法的结果
运行下面这段程序:
本节模型:madd / mmul / msub 模意义下加乘减(先取模防溢出、减法 +p 防负),fact_mod(n, p) 边乘边取模求 n!。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
long long madd(long long a, long long b, long long p) {
// 模意义下的加法:先各取模再相加取模
return (a % p + b % p) % p;
}
long long mmul(long long a, long long b, long long p) {
// 模意义下的乘法(a、b 都小于 p 约 1e9 时,乘积放得进 long long)
return (a % p) * (b % p) % p;
}
long long msub(long long a, long long b, long long p) {
// 模意义下的减法:+p 再取模,保证结果非负
return (a % p - b % p + p) % p;
}
long long fact_mod(int n, long long p) {
// n! mod p:边乘边取模
long long r = 1;
for (int i = 1; i <= n; i++) {
r = mmul(r, i, p);
}
return r;
}
int main() {
cout << madd(1000000000, 7, 1000000007) << endl;
}
(本题用 g++ -std=c++17 -O0 编译。)
全部评论