def reciprocal(base,precision,n):
m = 1
res = 0
ress = ""
for _ in range(precision):
while res*n%(m*base) != 1:
res += m
m *= base
return res
def to_base(num,base):
res = ""
while num:
res = str(num%base) + res
num //= base
return res
def gcd(a,b):
while b:
a,b = b,a%b
return a
def exp(p,n,precision):
precision += 10
old_res = 0
res = 1
m = 1
add = 1
i = 1
while old_res != res:
m *= n
g = gcd(m,i)
add = (add*n//g) * reciprocal(p,precision,i//g) % p**precision
i += 1
old_res = res
res += add
res %= p**precision
precision -= 10
return res%p**precision
p=3
n=3
precision = 1000
print(to_base(exp(p,n,precision),p))
p=2
n=4
print(to_base(exp(p,n,precision),p))
ZGVmIHJlY2lwcm9jYWwoYmFzZSxwcmVjaXNpb24sbik6CgltID0gMQoJcmVzID0gMAoJcmVzcyA9ICIiCglmb3IgXyBpbiByYW5nZShwcmVjaXNpb24pOgoJCXdoaWxlIHJlcypuJShtKmJhc2UpICE9IDE6CgkJCXJlcyArPSBtCgkJbSAqPSBiYXNlCglyZXR1cm4gcmVzCgpkZWYgdG9fYmFzZShudW0sYmFzZSk6CglyZXMgPSAiIgoJd2hpbGUgbnVtOgoJCXJlcyA9IHN0cihudW0lYmFzZSkgKyByZXMKCQludW0gLy89IGJhc2UKCXJldHVybiByZXMKCmRlZiBnY2QoYSxiKToKCXdoaWxlIGI6CgkJYSxiID0gYixhJWIKCXJldHVybiBhCgpkZWYgZXhwKHAsbixwcmVjaXNpb24pOgoJcHJlY2lzaW9uICs9IDEwCglvbGRfcmVzID0gMAoJcmVzID0gMQoJbSA9IDEKCWFkZCA9IDEKCWkgPSAxCgl3aGlsZSBvbGRfcmVzICE9IHJlczoKCQltICo9IG4KCQlnID0gZ2NkKG0saSkKCQlhZGQgPSAoYWRkKm4vL2cpICogcmVjaXByb2NhbChwLHByZWNpc2lvbixpLy9nKSAlIHAqKnByZWNpc2lvbgoJCWkgKz0gMQoJCW9sZF9yZXMgPSByZXMKCQlyZXMgKz0gYWRkCgkJcmVzICU9IHAqKnByZWNpc2lvbgoJcHJlY2lzaW9uIC09IDEwCglyZXR1cm4gcmVzJXAqKnByZWNpc2lvbgoKcD0zCm49MwpwcmVjaXNpb24gPSAxMDAwCgpwcmludCh0b19iYXNlKGV4cChwLG4scHJlY2lzaW9uKSxwKSkKCnA9MgpuPTQKCnByaW50KHRvX2Jhc2UoZXhwKHAsbixwcmVjaXNpb24pLHApKQ==