import sys
from random import *
def wyp(s):
sys.stdout.write(s)
roz=dict()
def GCD(a,b):
if a==0:
return b
return GCD(b%a,a)
def sqpow(n,k,m):
w=1
while(k):
if (k%2==1):
w=(w*n)%m
n=(n*n)%m
k=k/2
return w
def TRM(x,ile):
if (x==2 or x==3):
return 1
if (x%2==0 or x%3==0 or x==1):
return 0
t=0
j=0
z0=x-1
b=0
while (z0%2==0):
z0/=2
t+=1
while(ile):
b=sqpow(2+randint(0,x-3),z0,x)
if (b==1):
continue
j=0
while (j<t and b!=x-1 and b!=1):
b=(b*b)%x
j+=1
if (b!=x-1):
return 0
ile-=1
return 1
def find_factor(z):
#print "z=%d"%z
if ((z%2)==0):
return 2
c=randint(0,z-1)
x=2
y=2
d=1
while(d==1):
tp=(y*y+c)%z;
y=(tp*tp+c)%z;
x=(x*x+c)%z;
if (x>y):
d=GCD(x-y,z)
else:
d=GCD(y-x,z)
#print "d=%d"%d
return d
def rhofact(z):
#print z
global roz
if (z==1):
return
if (TRM(z,4)):
if (roz.has_key(z)):
roz[z]+=1
else:
roz[z]=1
return
f=0
while(1):
f=find_factor(z)
if (f!=z):
rhofact(f)
rhofact(z/f)
break
while(1):
a=int(sys.stdin.readline())
if a==0:
break
roz=dict()
#print a
rhofact(a)
#print roz
keylist = roz.keys()
keylist.sort()
for x in keylist:
wyp(str(x))
wyp("^")
wyp(str(roz[x]))
wyp(" ")
wyp("\n")
aW1wb3J0IHN5cwpmcm9tIHJhbmRvbSBpbXBvcnQgKgoKCmRlZiB3eXAocyk6CglzeXMuc3Rkb3V0LndyaXRlKHMpCgpyb3o9ZGljdCgpCgpkZWYgR0NEKGEsYik6CglpZiBhPT0wOiAKCQlyZXR1cm4gYgoJcmV0dXJuIEdDRChiJWEsYSkKCgpkZWYgc3Fwb3cobixrLG0pOgoJdz0xCgl3aGlsZShrKToKCQlpZiAoayUyPT0xKToKCQkJdz0odypuKSVtCgkJbj0obipuKSVtCgkJaz1rLzIKCXJldHVybiB3CgpkZWYgVFJNKHgsaWxlKToKCWlmICh4PT0yIG9yIHg9PTMpOgoJCXJldHVybiAxCglpZiAoeCUyPT0wIG9yIHglMz09MCBvciB4PT0xKToKCQlyZXR1cm4gMAoJdD0wCglqPTAKCXowPXgtMQoJYj0wCgl3aGlsZSAoejAlMj09MCk6CgkJejAvPTIKCQl0Kz0xCgl3aGlsZShpbGUpOgoJCWI9c3Fwb3coMityYW5kaW50KDAseC0zKSx6MCx4KQoJCWlmIChiPT0xKToKCQkJY29udGludWUKCQlqPTAKCQl3aGlsZSAoajx0IGFuZCBiIT14LTEgYW5kIGIhPTEpOgoJCQliPShiKmIpJXgKCQkJais9MQoJCWlmIChiIT14LTEpOgoJCQlyZXR1cm4gMAoJCWlsZS09MQoJcmV0dXJuIDEKCmRlZiBmaW5kX2ZhY3Rvcih6KToKCSNwcmludCAiej0lZCIlegoJaWYgKCh6JTIpPT0wKToKCQlyZXR1cm4gMgoJYz1yYW5kaW50KDAsei0xKQoJeD0yCgl5PTIKCWQ9MQoJd2hpbGUoZD09MSk6CgkJdHA9KHkqeStjKSV6OwoJCXk9KHRwKnRwK2MpJXo7CgkJeD0oeCp4K2MpJXo7CgkJaWYgKHg+eSk6CgkJCWQ9R0NEKHgteSx6KQoJCWVsc2U6CgkJCWQ9R0NEKHkteCx6KQoJI3ByaW50ICJkPSVkIiVkCglyZXR1cm4gZAoKZGVmIHJob2ZhY3Qoeik6CgkjcHJpbnQgegoJZ2xvYmFsIHJvegoJCglpZiAoej09MSk6CgkJcmV0dXJuCglpZiAoVFJNKHosNCkpOgoJCWlmIChyb3ouaGFzX2tleSh6KSk6CgkJCXJvelt6XSs9MQoJCWVsc2U6CgkJCXJvelt6XT0xCgkJcmV0dXJuCglmPTAKCXdoaWxlKDEpOgoJCWY9ZmluZF9mYWN0b3IoeikKCgkJaWYgKGYhPXopOgoJCQlyaG9mYWN0KGYpCgkJCXJob2ZhY3Qoei9mKQoJCQlicmVhawoKCQkJCgkJCQp3aGlsZSgxKToKCWE9aW50KHN5cy5zdGRpbi5yZWFkbGluZSgpKQoJaWYgYT09MDoKCQlicmVhawoJcm96PWRpY3QoKQoJI3ByaW50IGEKCXJob2ZhY3QoYSkKCSNwcmludCByb3oKCWtleWxpc3QgPSByb3oua2V5cygpCglrZXlsaXN0LnNvcnQoKQoJZm9yIHggaW4ga2V5bGlzdDoKCQl3eXAoc3RyKHgpKQoJCXd5cCgiXiIpCgkJd3lwKHN0cihyb3pbeF0pKQoJCXd5cCgiICIpCgl3eXAoIlxuIikKCQoJCgk=