一、题目描述
二、问题简析
本问题可以分成三部分求解:
- 1、求 \(p\) 和 \(q\):利用唯一分解定理,参考 P1075 [NOIP2012 普及组] 质因数分解
- 2、求 \(e\):利用拓展欧几里得定理,参考 P1082 [NOIP2012 提高组] 同余方程 和 拓展欧几里得算法
- 3、求 \(X\):利用快速幂,参考 P1226 【模板】快速幂 和 快速幂
三、AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
ll n = 1001733993063167141, d = 212353, C = 20190324;
ll extgcd(ll a, ll b, ll &x, ll &y)
{
if (b == 0)
{
x = 1, y = 0;
return a;
}
ll ret = extgcd(b, a % b, y, x);
y -= (a / b) * x;
return ret;
}
ll quickmi(ll x, ll n, ll m)
{
ll ans = 1;
while (n > 0)
{
if (n & 1)
ans = (__int128)ans * x % m;
x = (__int128)x * x % m;
n >>= 1;
}
return ans;
}
int main()
{
// 求p, q
ll p, q;
for (p = 2; p * p <= n; p++)
if (n % p == 0)
{
q = n / p;
break;
}
cout << "p = " << p << " "
<< "q = " << q << endl;
// 求e
ll MOD = (p - 1) * (q - 1), x, y;
extgcd(d, MOD, x, y);
ll e = (x % MOD + MOD) % MOD;
cout << "e = " << e << endl;
// 求原文X
cout << quickmi(C, e, n) << endl;
return 0;
}
注:
- 1、拓展欧几里得算法的解 \(x\),即 \(e\),取最小正整数解。
- 2、求快速幂时,使用
long long
会溢出,所以要采用更大的类型,如__int128
或__int256
。
完
标签:__,ll,long,蓝桥,2019,ans,填空 From: https://www.cnblogs.com/hoyd/p/18071607