OI loves Math(二)——有理数取模
在一些期望值的题目里,经常会遇到这么一句话:
输出期望值模 的结果。
然后你就万脸懵逼了,分数怎么取模?
别急!
看这个有理数取余,它里面直接给出了定义:
这个值被定义为 的解。
但问题来了,怎么求出 呢?
反推回去呗!
Part 1
。
但这不还是成小数了吗?
想想倒数的定义:
若 ,则 互为倒数。
我们这也一样,也就是说,在模 意义下, 和 互为倒数,也称作逆元。
但是怎么求出 的逆元呢?
Part 2 的逆元
第一种 费马小定理
如果 是一个质数,而整数 不是 的倍数,则有 。——百度
懂了吧?
第二种
先咕着,日后再更。
Part 3 代码
注意这里 很大,需要用高精除法取一下模。
#include <bits/stdc++.h>
using namespace std;
char A[10005], B[10005];
const long long mod = 19260817;
long long qpow(long long base, long long exp, long long mod) {
long long ans = 1;
while (exp) {
if (exp & 1) {
ans = (ans * base) % mod;
}
exp >>= 1;
base = (base * base) % mod;
}
return ans % mod;
}
int main() {
fgets(A, 1048576, stdin);
fgets(B, 1048576, stdin);
int n = strlen(A), m = strlen(B);
long long a = 0, b = 0;
for (int i = 0; i < n; i++) {
a = (a * 10 + (A[i] - '0')) % mod;
}
for (int i = 0; i < m; i++) {
b = (b * 10 + (B[i] - '0')) % mod;
}
if (!b) {
printf("Angry!");
} else {
long long b_inv = qpow(b, mod - 2, mod);
printf("%lld", (a * b_inv) % mod);
}
return 0;
}
Bye!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构