URAL 1141 计算模n的e次根

来源:互联网 发布:pip linux 编辑:程序博客网 时间:2024/06/01 10:43

给出 n=p*q p,q为素数 gcd(e, (p-1)*(q-1)) = 1, e < (p-1)*(q-1) ) 求m满足方程me = c (mod n)。

摘自《数论概论》



#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<map>#include<set>using namespace std;#define maxn 32050typedef long long ll;ll phi[maxn];void getphi(){    for(int i=1; i<maxn; i++) phi[i]=i;    for(int i=2; i<maxn; i+=2) phi[i]>>=1;    for(int i=3; i<maxn; i+=2)        if(phi[i]==i)            for(int j=i; j<maxn; j+=i)                phi[j]=phi[j]/i*(i-1);}void exgcd(ll a,ll b,ll &d,ll &x,ll &y){    if(b==0)    {        x=1,y=0,d=a;        return;    }    exgcd(b,a%b,d,x,y);    ll temp=x;    x=y,y=temp-(a/b)*y;}ll exp_pow(ll a,ll b,ll c){    a%=c;    ll q=1;    while(b)    {        if(b&1) q=q*a%c;        b>>=1,a=a*a%c;    }    return q;}int main(){    getphi();    int t;    ll e,n,c;    scanf("%d",&t);    while(t--)    {        scanf("%I64d%I64d%I64d",&e,&n,&c);        ll u,v,d;        exgcd(e,phi[n],d,u,v);        u=(u%phi[n]+phi[n])%phi[n];        printf("%I64d\n",exp_pow(c,u,n));    }    return 0;}


原创粉丝点击