Cod sursa(job #124541)

Utilizator DjSefuWrong name DjSefu Data 19 ianuarie 2008 15:49:13
Problema GFact Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<stdio.h>
FILE *f=fopen("gfact.in","r"),
     *g=fopen("gfact.out","w");
long long p,q,b,i,j,k,pr[89000],t,pu,ok,o,v[50],m,a,var,rev,c;
int main()
{ fscanf(f,"%lld %lld",&p,&q);
  pr[1]=2;           b=p;
  while(p%2==0) p/=2;
  k=1;ok=1;
  if(p==1) pu=2,ok=0,p=b;
  i=3;
  if(ok){ while(pr[k]*pr[k]<=b&&ok){ o=1;
				     for(j=2;pr[j]*pr[j]<i&&o;++j) if(i%pr[j]==0) o=0;
				     if(o) { pr[++k]=i;
					     if(p%pr[k]==0) { while(p%pr[k]==0) p/=pr[k];
							      if(p==1) ok=0;
							      pu=pr[k];
							    }
					   }
				      i+=2;
				    }
	  if(p>1) pu=b;
	  p=b;t=0;v[1]=1;i=1;
	  while(b%pu==0) b/=pu,++t;m=1;
	  t*=q;
	}
  else { while(b%pu==0) b/=pu,++t;
	 t*=q;
       }
  v[1]=1; i=1;b=p;m=1;
  while(v[i]<p*q) ++i,v[i]=v[i-1]*pu,++m;
  a=1;b=p*q;
  var=2;ok=1;
  while(b-a>=pu&&ok) { c=(a+b)/2+1;
		       rev=0;
		       for(i=2;i<=m;++i) rev+=c/v[i];
		       if(rev<t) a=c;
		       else if(rev>t) if(b!=c)b=c;
				      else ok=0;
		       else ok=0;
		     }
  while(c%pu) --c;
  fprintf(g,"%lld\n",c);
  fclose(f);
  fclose(g);
  return 0;
}