专栏文章

P12540 [XJTUPC 2025] 离散对数 题解

P12540题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip9d2is
此快照首次捕获于
2025/12/03 08:17
3 个月前
此快照最后确认于
2025/12/03 08:17
3 个月前
查看原文
我是糖比没看出来 b=(p1)2b = (p - 1) ^ 2
给定正整数 aa, cc, pp,保证 pp素数,求 bb 使得:
abbc(modp)a^b \equiv b^c \pmod{p}
显然若 ab(modp)a \equiv b \pmod p, 则: acbc(modp)a^c \equiv b^c \pmod p
根据费马小定理,有: ababmod(p1)(modp)a^b \equiv a^{b \bmod (p - 1)}\pmod p
则由二式可得, 若 ba(modp)b\equiv a \pmod p bc(modp1)b\equiv c \pmod {p - 1}abbc(modp)a^b \equiv b^c \pmod{p}
显然是个 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 条评论,欢迎与作者交流。

正在加载评论...