Codeforces и Polygon могут быть недоступны в период с 6 декабря, 22:00 (МСК) по 7 декабря, 00:00 (МСК) в связи с проведением технических работ. ×

Блог пользователя ypizarroza

Автор ypizarroza, 10 лет назад, По-английски

please someone that help me whith this problem http://www.spoj.com/problems/POWERUP/ i'm using the fermat little theorem a^p-1=a (mod p). Grace in advance

  • Проголосовать: нравится
  • +2
  • Проголосовать: не нравится

»
10 лет назад, # |
  Проголосовать: нравится -24 Проголосовать: не нравится

By Fermat theorem a^phi(m) == a (mod m) => a^(phi(m) — 1) == 1 (mod m). In this problem m == 10^9 + 7 is prime, so phi(m) == m — 1.

So A^(B^C) (mod m) == A^(B^C mod (phi(m) — 1)) (mod m) == A^(B^C mod (m — 2)) (mod m).

»
10 лет назад, # |
  Проголосовать: нравится 0 Проголосовать: не нравится

There are some tricky cases when a mod p == 0

  • »
    »
    10 лет назад, # ^ |
    Rev. 2   Проголосовать: нравится -8 Проголосовать: не нравится
    I have proven to these cases. Please one user that has AC this problem. please  look my code:
    #include <bits/stdc++.h>
    #define ifc(x)(flag[x>>6]&(1<<((x>>1)&31)))
    #define isc(x)(flag[x>>6]|=(1<<((x>>1)&31)))
    using namespace std;
    typedef long long i64;
    #define MOD 1000000007
    typedef long long i64;
    i64 multiply(i64 a,i64 b, i64 mod){
     i64 rx=0,sx=0;
      for (int bx=0; b>>bx>0; ++bx){
        sx+=(bx)?sx:a;
        if(sx>=mod) sx-=mod;
        rx+=((b>>bx)&1)?sx:0;
        while(rx>=mod) rx-=mod;
      }
      return rx;
    }
    i64 modpow(i64 a,i64 b, i64 mod){
      i64 rx=1,sx=0;
      for(int bx=0; b>>bx>0; ++bx){
        sx=(bx)?multiply(sx,sx,mod):a;
        rx=((b>>bx)&1)?multiply(rx,sx,mod):rx;
      }
      return rx;
    }
    i64 sol;
    int cas,a,b,c;
    int main(){
    
    	      while(1){
    	      scanf("%d %d %d",&a,&b,&c);
    	      if(a+b+c==-3)break;
    		  i64 x=modpow(b,c,MOD-1);
    		  printf("%lld\n",modpow(a,x,MOD));
    	      }
    }
    
    
    

    ``