专栏文章
P12540 [XJTUPC 2025] 离散对数 题解
P12540题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mip9d2is
- 此快照首次捕获于
- 2025/12/03 08:17 3 个月前
- 此快照最后确认于
- 2025/12/03 08:17 3 个月前
我是糖比没看出来 。
给定正整数 , , ,保证 是 素数,求 使得:
显然若 , 则:
根据费马小定理,有:
则由二式可得, 若
则
显然是个 ExCRT 板子。
CPP#include<bits/stdc++.h>
using namespace std;
#define int long long
std::ostream& operator << (std::ostream &out,__int128 a){
if(a<0)out<<'-',a=-a;
if(a>9)out<<a/10;
return out<<(int)(a%10);
}
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
__int128 exgcd(__int128 a, __int128 b, __int128 &x, __int128 &y) {
if(b == 0) {
x = 1;
y = 0;
return a;
}
__int128 ret = exgcd(b, a % b, x, y);
__int128 t = x;
x = y;
y = t - (a / b) * y;
return ret;
}
struct equ{
__int128 a, mod;
equ operator +(equ b) {
__int128 k1, k2;
/*
x = r1 mod m1 x = k1m1 + r1
x = r2 mod m2 x = k2m2 + r2
k1m1 - k2m2 = r2 - r1
*/
__int128 _m = mod / gcd(mod, b.mod) * b.mod;
exgcd(mod, b.mod, k1, k2);
k1 = (k1 + _m) % _m;
k1 = ((b.a - a) / gcd(mod, b.mod) + _m) % _m * k1 % _m;
__int128 _r = (k1 * mod + a) % _m ;
return {_r, _m};
}
};
signed main() {
long long a;
cin >> a;
equ now;
long long md, c;
cin >> c >> md;
now = {a, md};
now = now + (equ){c, md - 1};
cout << now.a;
return 0;
}
相关推荐
评论
共 0 条评论,欢迎与作者交流。
正在加载评论...