結果
| 問題 | 
                            No.181 A↑↑N mod M
                             | 
                    
| コンテスト | |
| ユーザー | 
                             yaoshimax
                         | 
                    
| 提出日時 | 2015-05-09 18:37:41 | 
| 言語 | PyPy2  (7.3.15)  | 
                    
| 結果 | 
                             
                                AC
                                 
                             
                            
                         | 
                    
| 実行時間 | 439 ms / 5,000 ms | 
| コード長 | 913 bytes | 
| コンパイル時間 | 1,901 ms | 
| コンパイル使用メモリ | 76,728 KB | 
| 実行使用メモリ | 78,720 KB | 
| 最終ジャッジ日時 | 2024-11-24 03:23:43 | 
| 合計ジャッジ時間 | 21,527 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge5 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 6 | 
| other | AC * 37 | 
ソースコード
def gcd(i,j):
    if j<i:
        return gcd(j,i)
    if j%i==0:
        return i
    else:
        return gcd(j%i,i)
def getint(i):
    ret=0
    for j in range(i-1,0,-1):
        if gcd(j,i)==1:
            ret+=1   
    return ret
interval=[getint(i) for i in range(0,2001)]
def getExpWithUpperBound(A,N,M):
    if N==0:
        return min(1,M)
    if N==1:
        return min(A,M)
    if N==2 and A<=16:
        return min(pow(A,A),M)
    if N==3 and A<=3:
        return min(pow(A,pow(A,A)),M)
    if N==4 and A<=2:
        return min(pow(A,pow(A,pow(A,A))),M)
    else:
        return M
def hypermod(A,N,M):
    #print A,N,M
    if M==1:
        return 0
    if N==0:
        return 1
    e=getExpWithUpperBound(A,N-1,M)
    if e<M:
        return pow(A,e,M)
    else:
        return pow(A,M+((hypermod(A,N-1,interval[M])-M)%interval[M]),M)
    
A,N,M=map(int,raw_input().split())
print hypermod(A,N,M)
            
            
            
        
            
yaoshimax