Cod sursa(job #2579021)

Utilizator valentinchipuc123Valentin Chipuc valentinchipuc123 Data 11 martie 2020 20:51:06
Problema Frac Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <cmath>
using namespace std;

ifstream f("frac.in");
ofstream g("frac.out");

unsigned long long int n,p,drv[100000],nr=0,st,dr,rasp,mid,val;
unsigned long long int put=1,numar,prod,ct,fin;

int rez(unsigned long long int r)
 {
  unsigned long long int sum=0;
  for(long long int i=1;i<=put;i++)
   {
    unsigned long long int cpy=i;
    numar=0; prod=1; ct=0;
    while(cpy!=0)
     {
      ct++;
      if(cpy%2==1)
       {
        numar++;
        prod*=drv[ct];
       }
      cpy/=2;
     }
    if(r>=prod)
    {
    if(numar%2==1)
     sum+=r/prod;
    else
     sum-=r/prod;
    }
   }
  return r-sum;
 }
int main()
{
f>>n>>p;
for(long long int i=2;i*i<=n;i++)
 if(n%i==0)
  {
   nr++;
   drv[nr]=i;
   while(n%i==0)
    n/=i;
  }

if(n!=1)
 {
  nr++;
  drv[nr]=n;
 }
st=1;
dr=1;
for(int i=1;i<=61;i++)
 dr*=2;
for(int i=1;i<=nr;i++)
  put*=2;
put--;
rasp=dr;
while(st<=dr)
 {
  mid=(st+dr)/2;
  fin=rez(mid);
  if(fin>=p) {
              if(fin==p)
               rasp=mid;
              dr=mid-1;
             }
  else st=mid+1;
 }
g<<rasp;
}