Cod sursa(job #60568)

Utilizator moga_florianFlorian MOGA moga_florian Data 15 mai 2007 14:29:52
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>
#include<math.h>

int d[100],nd;

long long f(long long x)
{
//divizorii primi
long long i,sol=0,backup=x;

nd=0;
if(x%2==0)
   {
   d[++nd]=2;
   while(x%2==0)
      x>>=1;
   }

for(i=3;i<=(long long)sqrt((double)x);i+=2)
   if(x%i == 0)
      {
      d[++nd]=i;
      while(x%i==0)
         x/=i;
      }
      
if(x!=1)
  d[++nd]=x;
    
int conf,diviz,n1; 
for(conf=1;conf< (1<<nd);conf++)
   {
   diviz=1;
   n1=0;
   
   for(i=0;i<nd;i++)
     if( ((1<<i) & conf) )
        {
        diviz*=d[i+1];  
        n1++;
        }
   
   if(n1%2)
      sol+=backup/diviz;
   else
      sol-=backup/diviz;
   }
     
return backup-sol;
}     

int main()
{
FILE *fin=fopen("frac.in","r"),
     *fout=fopen("frac.out","w");
     
long long N,P;
fscanf(fin,"%lld %lld",&N,&P);

long long li,lf,mij,sol;
li=1;lf=((long long)1<<50);

while(lf-li>1)
  {
  mij=(li+lf)>>1;
  
  sol=f(mij);
  if(sol<P)
     li=mij;
  else
     lf=mij;  
  }
  
if(f(li)==P)
   fprintf(fout,"%lld\n",li);
else
   fprintf(fout,"%lld\n",lf);
   
fclose(fin);
fclose(fout);
return 0;         
}