标签:span 题目 logs val his i++ blog bit author
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; typedef long long LL; /* 题目要求 > calculate n = p × q, calculate F(n) = (p - 1) × (q - 1) > choose an integer e(1 < e < F(n)), making gcd(e, F(n)) = 1, e will be the public key > calculate d, making d × e mod F(n) = 1 mod F(n), and d will be the private key 知道 P Q E gcd(a,b) == 1 等价于 存在x,y a*x+b*y==1 存在x,y e*x + F(n)*y = 1 d*e%F(n) = 1%F(n) d*e + F(n)*y = 1; 通过求逆元方法解出 d 即可 */ LL p,q,e,l; LL ex_gcd(LL a,LL b,LL &x,LL &y) { if(b==0) { x = 1; y = 0; return a; } LL ans = ex_gcd(b,a%b,x,y); LL tmp = x; x = y; y = tmp - a/b*x; return ans; } LL cal(LL a,LL b,LL c) { LL x=0,y=0; LL gcd = ex_gcd(a,b,x,y); if(c%gcd!=0) return -1; x *= c/gcd; b /= gcd; if(b<0) b = -b; LL ans = x%b; if(ans<0) ans+=b; return ans; } int main() { while(scanf("%lld%lld%lld%lld",&p,&q,&e,&l)!=EOF) { LL fn = (p-1)*(q-1),n = p*q; LL d = cal(e,fn,1); LL tmp,ans; for(int i=0;i<l;i++) { scanf("%lld",&tmp); tmp %= n; ans = 1; for(int j=0;j<d;j++) ans = (ans*tmp)%n; printf("%c",ans%n); } printf("\n"); } }
标签:span 题目 logs val his i++ blog bit author
原文地址:http://www.cnblogs.com/joeylee97/p/6658240.html