Problem Description
CX is a programmer of a mooc company. A few days ago, he took the blame for leakage of users' data. As a result, he has to develop an encryption algorithm, here is his genius idea.
First, the protocol specifies a prime modulus M, then the server generates a private key P, and sends the client a public key Q. Here Q=P−1,P×Q≡1 mod M.
Encryption formula: encrypted_data=raw_data×P mod M
Decryption formula: raw_data=encrypted_data×Q mod M
It do make sense, however, as a master of number theory, you are going to decrypt it.You have intercepted information about P,Q,encrypted_data, and M keeps unknown. If you can decrypt it, output raw_data, else, say "shuanQ" to CX.
Input
First line has one integer T(T≤20), indicating there are T test cases. In each case:
One line has three integers P,Q,encrypted_data. (1<P,Q,encrypted_data≤2×10^6)
It's guaranteed that P,Q,encrypted_data<M.
Output
In each case, print an integer raw_data, or a string "shuanQ".
Sample Input
2 5 5 5 6 6 6
Sample Output
shuanQ 1
题解:首先要求出M,从题目中可以得到M是质数,输入的三个数都要小于M,求出M就可以求出输出了。
认识:long long 的使用,注意变换;
m=i是为了防止km=1。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ios::sync_with_stdio(false);
int T;
cin>>T;
while(T--)
{
int p,q;
ll r,e,m;
ll km;
cin>>p>>q>>e;
km=(ll)p*q-1,r=0;
for(ll i=2;i*i<=km;i++)//ll
{
if(km%i)
continue;
while(km%i==0)
km/=i;
m=i;
}
//cout<<km<<endl;
if(km>1)
m=km;
if(p<m&&q<m&&e<m)
r=(ll)e*q%m;
if(r)
cout<<r<<endl;
else
cout<<"shuanQ"<<endl;
}
return 0;
}