x^y % m 大数


测试http://acm.fzu.edu.cn/problem.php?pid=1759

typedef long long LL ;

LL   phi(LL n){
     LL s = n ;
     for(LL i = 2 ; i*i <= n ; i++){
          if(n % i == 0)  s = s/i*(i-1) ;
          while(n % i == 0) n /= i ;
     }
     if(n != 1)  s = s/n*(n-1) ;
     return s ;
}

LL  Pow(LL x , LL y , LL m){
    LL s = 1 ;
    for( ; y ; y>>= 1){
        if(y&1) { s *= x ; s %= m ;}
        x *= x ; x %= m ;
    }
    return s;
}

LL   Pow(LL x , char *y , LL m){
     LL phim = phi(m) ;
     LL s = 0  ;
     for(int i = 0 ; y[i]!= '\0' ; i++){
          s = s*10 + y[i] - '0' ;
          if(s >= m) break ;
     }
     if(s>=m){
          s = 0 ;
          for(int i = 0 ; y[i] != '\0' ; i++){
              s = s*10 + y[i] - '0' ;
              if(s >= phim) s %= phim ;
          }
          s += phim ;
          return Pow(x , s , m) ;
     }
     else return Pow(x , s , m) ;
}

char y[1000008] ;

int  main(){
     LL x , m  ;
     while(scanf("%I64d%s%I64d" ,&x ,y ,&m) != EOF)
          printf("%I64d\n" , Pow(x , y , m)) ;
     return 0 ;
}


你可能感兴趣的:(x^y % m 大数)