传送门:Faulty Factorial
分析:
分为n==p, n>=2*p, 2*p>n>p , n<p 四种情况讨论
其中n==p使用到了威尔逊定理,且注意, n=p=2,无解
情况不难想,看代码吧
#include <iostream>
using namespace std;
typedef long long LL;
LL n,p,r;
LL qpow(LL a, LL b) {
LL ans = 1;
while (b) {
if (b&1) ans = ans*a%p;
a = a*a%p;
b>>=1;
}
return ans;
}
int main(){
cin >> n >> p >> r;
if (n == p) {
if (r == 0) {
if (n == 2) cout << -1 << " " << -1 << endl;
else cout << 2 << " " << 1 << endl;
return 0;
}
else {
for (LL i=1; i<p; i++) if (i*(p-1)%p==r) {
cout << p << " " << i << endl;
return 0;
}
cout << -1 << " " << -1 << endl;
return 0;
}
}
if (n>=2*p) {
if (r == 0) cout << p+1 << " " << 1 << endl; else cout << -1 << " " << -1 << endl;
return 0;
}
if (n>p) {
if (r == 0) cout << p+1 << " " << 1 << endl;
else {
LL t = 1;
for (LL i=2; i<=n; i++) if (i!=p) t = t*i%p;
for (LL i=1; i<p; i++) if (t*i%p==r) { cout << p << " " << i << endl; return 0; }
cout << -1 << " " << -1 << endl;
}
return 0;
}
if (n<p) {
if (r == 0) cout << -1 << " " << -1 << endl;
else {
LL t = 1;
for (LL i=2; i<=n; i++) t = t*i%p;
t = qpow(t,p-2);
for (LL i=2; i<=n; i++) {
LL tmp = r*i%p*t%p;
if (tmp>=1 && tmp<i) { cout << i << " " << tmp << endl; return 0; }
}
cout << -1 << " " << -1 << endl;
}
}
return 0;
}