Cod sursa(job #1012382)

Utilizator RaduGabriel2012Dinu Radu RaduGabriel2012 Data 18 octombrie 2013 21:13:34
Problema Frac Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
bool ok[1000005];
int pr[80005],k=0,dv=0,ind;
long long a,b,d[1005];

void GenPrimes()
{ int i,j,vmax=1000000;
   for(i=2;i<=vmax;i++)
    { if (!ok[i])
       {k++; pr[k]=i;
         for(j=i+i;j<=vmax;j+=i)
          ok[j]=1;
       }
    }
}

void Desc(long long x)
{ int i;
    dv=0;
   for(i=1;i<=k && x>1;i++)
    {if (x%pr[i]==0)
       { dv++; d[dv]=pr[i];
         while(x%pr[i]==0) x/=pr[i];
       }
     if (1LL*pr[i]*pr[i]>1LL*x) break;
    }
 if (x>1) {dv++; d[dv]=1LL*x;}

}

long long Ans(long long lim)
{ int i,j,num=0;
  long long mult=0,sol=0;

  for(i=1;i<(1<<dv);i++)
  { num=0; mult=1;
     for(j=0;j<dv;j++)
      if (i&(1<<j)) {mult*=1LL*d[j+1]; num++;}
    if (num%2==1) sol+=1LL*(lim/mult);
     else sol-=1LL*(lim/mult);
  }

 return 1LL*(lim-sol);
}

void Search()
{ long long st=1,dr=(1LL<<61),mid=0;
   while(st<dr)
   { mid=(st+dr)/2;
     if (1LL*Ans(mid)>=1LL*ind) dr=1LL*mid; else st=1LL*(mid+1);
   }
 g<<st;
}
int main()
{ int t;
    GenPrimes();

    f>>b>>ind;
     Desc(b);
    Search();


    return 0;
}