题意
Q
=
P
−
1
,
P
×
Q
≡
1
m
o
d
M
Q = P ^ {-1},P \times Q \equiv 1 \mod M
Q=P−1,P×Q≡1modM,
Q
=
P
−
1
Q=P−1
Q=P−1
e
n
c
r
y
p
t
e
d
d
a
t
a
=
r
a
w
d
a
t
a
×
P
m
o
d
M
encrypted_{data} = raw_{data} \times P \mod M
encrypteddata=rawdata×PmodM
r
a
w
d
a
t
a
=
e
n
c
r
y
p
t
e
d
d
a
t
a
×
Q
m
o
d
M
raw_{data} = encrypted_{data} \times Q \mod M
rawdata=encrypteddata×QmodM
多组数据,对于给定的
P
P
P、
Q
Q
Q、
e
n
c
r
y
p
t
e
d
d
a
t
a
encrypted_{data}
encrypteddata,输出对应的
r
a
w
d
a
t
a
raw_{data}
rawdata,没有合法解输出“ShuanQ”。
思路
由题意得 P ∗ Q = 1 ( m o d M ) P*Q=1(mod M) P∗Q=1(modM),
所以 P ∗ Q − k ∗ M = 1 P*Q-k*M=1 P∗Q−k∗M=1,
所以 M ∣ ( P ∗ Q − 1 ) M|(P*Q-1) M∣(P∗Q−1),
又M是质数且比P、Q、enc大,
所以
P
∗
Q
−
1
P*Q-1
P∗Q−1 分解出质因子和
P
,
Q
,
e
n
c
P,Q,enc
P,Q,enc 比较一下就结束了。
代码
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <map>
#include <queue>
using namespace std;
const int N=100001;
int T,n,k;
long long P,Q,m,qwq;
int solve()
{
scanf("%lld%lld%lld",&P,&Q,&m);
qwq=P*Q-1;
for (long long i=2;i*i<=qwq;++i)
while (qwq%i==0) qwq/=i;
if (qwq>m&&qwq>P&&qwq>Q) printf("%lld\n",m*Q%qwq);
else printf("shuanQ\n");
}
int main()
{
for (scanf("%d ",&T);T--;) solve();
// solve();
}