X^A mod P = B,其中P为质数。给出P和A B,求< P的所有X。
例如:P = 11,A = 3,B = 5。
3^3 Mod 11 = 5
所有数据中,解的数量不超过Sqrt(P)。
input:
3
11 3 5
13 3 1
13 2 2
output:
3 1 3 9 No Solution
解:
g为p的原根,p为素数,所以phi(p)=p-1。
原根的性质得:如果g为p的原根,则:g^i mod p != g^j mod p (p为素数),
其中i != j且i, j介於1至(p-1)之间
所以,可以设g^y=x, g^t=a,则有:
g^(y*N)%p=g^t
又由原根的性质:
g^(y*N)%p=g^t -> (y*N)%(p-1)=t (拓展欧几里得解)
另外g^t=a可以由离散对数求出
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 100005;
bool pd[maxn];
ll pri[maxn],ans[maxn];;
vector<ll> phipri;
map<ll,ll> mp;
int t,num,cnt;
ll p,a,b,g,phip;
void pre() {
for(int i=2; i<=maxn-5; ++i) {
if(!pd[i]) pri[++num]=i;
for(int j=1; j<=num&&i*pri[j]<=maxn-5; ++j) {
pd[i*pri[j]]=1;
if(i%pri[j]==0) break;
}
}
}
ll ksm(ll x,ll y,ll mod)
{
ll