Cod sursa(job #2784912)

Utilizator enedumitruene dumitru enedumitru Data 17 octombrie 2021 18:07:30
Problema Frac Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
/**#include<fstream>
#define LL long long
using namespace std;
ifstream f("frac.in"); ofstream g("frac.out");
LL p,n,k,prim[11];
LL nr(LL x)
{   LL r=0;
    for(LL prod,sgn,i=0;i<(1LL<<k);++i)
    {   prod=sgn=1;
        for(LL j=0;j<k;++j)
			if((i&(1<<j)) != 0) prod*=prim[j], sgn*=-1;
		r+=sgn*x/prod;
    }
    return r;
}
LL caut()
{   LL i,pas=1LL<<60;
    for(i=0;pas;pas>>=1)
        if(nr(i+pas)<p) i+=pas;
    return i+1;
}
int main()
{   f>>n>>p;
    for(LL i=2;i*i<=n;++i)
        if (n%i==0)
        {   prim[k++]=i;
            while(n%i==0) n/=i;
        }
    if(n>1) prim[k++]=n;
    g<<caut()<<'\n'; g.close(); return 0;
}
*/
#include <iostream>
#include <fstream>
#define ull unsigned long long
using namespace std;
ifstream f("frac.in"); ofstream g("frac.out");
ull k,prim[11];
ull rez(ull x)
{   ull nr=x;
    for(int i=1;i<(1LL<<k);i++)
    {   ull q=0,p=1;
        for(ull j=0;j<k;j++)
            if(i&(1LL<<j)) {q++; p=p*prim[j+1];}
        if(q%2==0)nr-=x/p; else nr+=x/p;
    }
    return nr;
}
int main()
{   ull n,p;
    f>>n>>p;
    ull d=2;
    while(d*d<=n)
        if(n%d==0)
        {   prim[++k]=d;
            while(n%d==0) n/=d;
        }
        d++;
    if(n>1)prim[++k]=n;
    ull st=1,dr=(1LL<<61);
    while(st<=dr)
    {   ull m=(st+dr)/2;
        if(rez(m)<p) st=m+1; else dr=m-1;
    }
    g<<st; g.close(); f.close(); return 0;
}