题目传送门
简单说一下题目意思,就是给你两个数,一个整数
y
y
y 和 一个质数
p
p
p ,然后让你再另外找一个数
x
x
x 满足
(
x
∗
y
(x*y
(x∗y)%
p
=
=
1
p==1
p==1,如果这个
x
x
x不存在的话,就输出
−
1
-1
−1;存在的话就输出
x
x
x%
p
p
p,好题意就是这么个意思,接下来展开思路的分析:
首先对于x不存在的情况就只有一种,即:若
y
y
y%
p
=
=
0
p==0
p==0,则
x
x
x一定不存在,因为余数一直就是
0
0
0不可能是
1
1
1,接着就是分析
x
x
x存在的情况,不妨看下面的图吧。
上代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll qpow(ll a,ll b,ll p)
{
ll res=1;
while(b)
{
if(b%2!=0)
{
res=res*a%p;
b--;
}
a=a*a%p;
b/=2;
}
return res;
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
ll y,p;
scanf("%lld%lld",&y,&p);
if(y%p==0) cout<<-1<<endl;
else{
ll cnt=qpow(y,p-2,p);
//(k*p+1)*cnt==k*p*cnt+cnt
printf("%lld\n",cnt%p);
}
}
return 0;
}
/*
(x*y)%p==1; k*p+1=x*y--->x==((k*p+1)/y)%p
*/