离散对数(洛谷P12540)
题目描述:
给定正整数 a, c, p,保证 p 是 素数,求 b 使得:
我们称整数 A,B,C 有 A≡B(modC),当且仅当存在整数 k 使得 。
解题思路:
这道题若a,p互质,则根据费马小定理得到,根据题中的式子就可以得出
所以就有
将这个式子再度展开就可以得到
。但
等于
因为
,所以
. 所以
. 所以
但是我们又希望同时
。由于
,所以条件变成了
要满足这个等式我们就需要选择k使得满足上述条件,我们可以令
,此时,右边的
等于
,而对于左边来说我们希望能让这一部分等于
所以,可以令
. 因为如果这样的话,左边就是
,而右边同样也是
此时等式成立。
所以,要满足 因此,
所以,k可以等于
,其中t是任意整数。那么此时我们就可以推出结论
解决代码
#include<bits/stdc++.h>
#define endl "\n"
using namespace std;
typedef long long LL;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
LL a,b,c,p;
cin >> a >> c >> p ;
LL n = a % p;
LL m = c % (p - 1);
LL k = (m - n) % (p - 1);
if(k < 0)
k += (p - 1);
if(p == 1)
cout << 1;
else
{
cout <<k * p + n;
}
return 0;
}