扩展欧几里德求逆元,快速幂 hdoj 1211
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1211
题目思路:此题看上去很复杂,确实我理解了很长时间。。。
总结来说,算出n,f(n),再由n,f(n)得到d的值,可知d即是e的mod f(n)的逆元,最后由(输入的数)c^d%mod,用快速幂求出即可。
若没有接触过扩展欧几里德,可以点击:
http://blog.csdn.net/qq_33199236/article/details/51429013
ac代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <map>
#include <string>
using namespace std;
long long exgcd(long long a,long long b,long long& x,long long& y)
{
if(b == 0)
{
x = 1;
y = 0;
return a;
}
long long d = exgcd(b,a%b,x,y);
long long temp = x;
x = y;
y = temp - a/b*y;
return d;
}
long long quick_mi(long long mod,long long x,long long y)
{
long long ans = 1;
while(y)
{
if(y&1) ans = (ans*x)%mod;
x = (x*x)%mod;
y >>= 1;
}
return ans;
}
int main()
{
long long p,q,e,l;
while(~scanf("%lld%lld%lld%lld",&p,&q,&e,&l))
{
long long n = p*q;
long long fn = (p-1)*(q-1);
long long x,y;
int d = exgcd(e,fn,x,y);
while(x < 0)
x += fn;
while(l--)
{
long long h;
scanf("%lld",&h);
long long ans;
ans = char(quick_mi(n,h,x));
printf("%c",ans);
}
printf("\n");
}
return 0;
}