1 条题解
-
1
题意分析
- 加密明文()至密文(),。
- 解密密文至明文(设解密出的为 ),。
- 给定 ,求 。
整理条件可以得出:
或:
继续推导得到:
问题转化:求 下的乘法逆元。
思路
特判
推导:
$$a \times x \equiv 1 \pmod m \\ a \times x - 1 = k \times m \\ a \times x - (k \times m) = 1 \\ a \times x + m \times (-k) = 1 \\ $$根据裴蜀定理:
对于任意整数 ,一定存在整数 使得 。
继续推导式子,我们得到:
本题中 ,因此如果 可以被 或 整除则 ,无满足条件 。
扩展欧几里得
扩展欧几里得用于在线性时间内求解裴蜀定理。
思想
推导式子:
显然 。
设两个未知数 。
开始推导:
$$\gcd(a, b) = bx' + (a - \lfloor a \div b \rfloor \times b) \times y' \\ \gcd(a, b) = bx' + ay' - \lfloor a \div b \rfloor \times b \times y' \\ \gcd(a, b) = ay' + b(x' - \lfloor a \div b \rfloor \times b \times y') \\ $$对比 ,得出:
$x = y', y = x' - \lfloor a \div b \rfloor \times b \times y'$
递归模拟过程即可。
代码
#include <bits/stdc++.h> using namespace std; int exgcd(int a, int b, int &x, int &y) { if (b == 0) { x = 1; y = 0; return a; } int gcd = exgcd(b, a % b, y, x); y -= (a / b) * x; return gcd; } int a; const int MOD = 100000; int main() { cin >> a; int x, y; if (exgcd(a, MOD, x, y) != 1) { cout << "NO" << "\n"; return 0; } int b = (x % MOD + MOD) % MOD; if(b < 100 || b > 9999) cout << "NO" << "\n"; else cout << b << endl; return 0; }
- 1
信息
- ID
- 18
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 2
- 标签
- 递交数
- 6
- 已通过
- 2
- 上传者