Cod sursa(job #2278099)

Utilizator Cojocaru_Andrei_CristianCojocaru Andrei Cristian Cojocaru_Andrei_Cristian Data 7 noiembrie 2018 11:43:54
Problema Frac Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.17 kb
#include <fstream>

using namespace std;
long long dp[20];
long long x=0;
long long n,p;
long long verif(long long mij)
{
      int sum=0;
      for(int i=1;i<=x;i++)
      {
         sum=sum+mij/dp[i];
         for(int j=i+1;j<=x;j++)
         {
             sum=sum-mij/(dp[i]*dp[j]);
         }
      }
      return mij-sum;
}
int main()
{   ifstream cin("frac.in");
    ofstream cout("frac.out");
    cin>>n>>p;
    if(n==1)
    {
        cout<<p;
        return 0;
    }
    for(int i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            dp[++x]=i;
        }
        while(n%i==0)
            n/=i;
    }
    if(n>1)
    {
        dp[++x]=n;
    }
    long long st=1,dr=1,mij;
    for(int i=1;i<=61;i++)
        dr=dr*2;
    long long boi;
    while(st<=dr)
    {
    mij=(st+dr)/2;
    long long t=verif(mij);
    if(t==p)
    {
        boi=mij;
        break;
    }
    if(t>p)
    {
        dr=mij-1;
    }
    else
        st=mij+1;
    }
    for(int i=boi;i>=1;i--)
    {
        long long t=verif(i);
        if(t!=p)
            break;
        else
            boi=i;
    }
    cout<<boi;
    return 0;
}