#include<stdio.h>
#include<string.h>
#include<math.h>
#define SZ 1000005
long prime[78600] ,c = 0 , store[SZ][8];
bool flag[SZ];
void seive();
void store1_to_nfact();
int main()
{
 long n ,i ,p ,e ,x;
 seive();
 store1_to_nfact();
 while(scanf("%ld" , &n)==1 && n)
 {
  for(i = 0;i<8;i++)
  {
   x = store[n][i];
   e = (x&31);
   p = x>>5;
   if(p!=0)
    printf("%ld^%ld\n" , p , e);
   else
    break;
  }
 }
 return 0;
}
void seive()
{
 long i ,j ,r;
 flag[0] = flag[1] = true;
 for(i = 4;i<SZ;i+=2)
  flag[i] = true;
 prime[c++] = 2;
 for(i = 3;i<SZ;i+=2)
 {
  if(!flag[i])
  {
   prime[c++] = i;
   if(SZ/i>=i)
   {
    r = i*2;
    for(j = i*i;j<SZ;j+=r)
     flag[j] = true;
   }
  }
 }
}
void store1_to_nfact()
{
 long count,i ,root,j , freq ,temp , p , x;
 store[0][0] = store[1][0] = 0;
 for(i = 2;i<SZ;i++)
 {
  count = 0;
  if(!flag[i])
  {
   x = i;
   x = ((x<<5)|1);
   store[i][0] = x;
  }
  else
  {
   temp = i;
   root = (long)sqrt(i);
   for(j = 0;prime[j]<=root;j++)
   {
    p = 0;
    if(temp%prime[j]==0)
    {
     freq = 0;
     while(temp%prime[j]==0)
     {
      freq++;
      temp/=prime[j];
     }
     x = prime[j];
     x = ((x<<5)|freq);
     store[i][count++] = x;
     if(!flag[temp])
     {
      x = temp;
      x = ((x<<5)|1);
      store[i][count++] = x;
      p = 1;
      break;
     }
     root = (long)sqrt(temp);
    }
    if(p==1)
     break;
   }
  }
 }
}
 
No comments:
Post a Comment