Cod sursa(job #67405)

Utilizator infogodinfo god infogod Data 24 iunie 2007 15:21:39
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<fstream.h>
#include<stdio.h>
#include<math.h>

long long unsigned p;
long long unsigned q, b, nr;
long long unsigned a, v[10], ex;

void citire()
{
  ifstream in("gfact.in");
  in>>p>>q;
  in.close();
}

int prim(long x)
{
  if (x==2) return 1;
  if (x==1) return 0;
  if (x%2==0) return 0;
  for (long long unsigned d=3; d*d<=x; d+=2)
    if (x%d==0) return 0;
  return 1;
}

void descomp()
{
  int ok=1;b=p;
  for (long long unsigned  d=2; d<=p; d++)
    {
      if (p%d==0)
      {
	v[++nr]=d;
	ex=0;
	while (p%d==0) { p/=d; ex++;}
	if (prim(p)) { v[++nr]=p; ex=1; ok=0;}
      }
      if (ok==0) {p=v[nr]; break;}
    }    
}


void aflup()
{
  long long unsigned i, contor=0;
  
  i=p;
  while (contor<q)
   {
     long long unsigned j;
     j=i;
     if (j%p==0)
       while (j%p==0)
	 {
	   contor++;
	   j/=p;
	 }
     i+=p;
   }
  freopen("gfact.out","w",stdout);
  printf("%llu",i-p);
  
}

void aflu()
{
  long long unsigned i, contor=0;
  
  i=v[nr];
  while (contor<q*ex)
   {
     long long unsigned j;
     j=i;
     if (j%v[nr]==0)
       while (j%v[nr]==0)
	 {
	   contor++;
	   j/=v[nr];
	 }
     i+=v[nr];
   }
  freopen("gfact.out","w",stdout);
  printf("%llu",i-v[nr]);
  
}

int main()
{
  citire();
  if (prim(p)) aflup();
  else{
        descomp();
        aflu();
      }
  return 0;
}