Cod sursa(job #2277734)

Utilizator LucianTLucian Trepteanu LucianT Data 6 noiembrie 2018 19:22:06
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <fstream>
#include <vector>
using namespace std;

const long long maxN=12e9;

long long n,p;

vector<long long> divs;

long long countCoprimes(long long x){
    long long lim=1LL<<divs.size();
    long long res=0;

    for(long long mask=0;mask<lim;mask++){
        int sgn=1;
        long long prod=1LL;

        for(int i=0;i<divs.size();i++)
            if(mask&(1LL<<i)){
                sgn*=-1;
                prod*=divs[i];
            }

        res+=x/prod*sgn;
    }

    return res;
}

int main(){
    ifstream cin("frac.in");
    ofstream cout("frac.out");

    cin>>n>>p;
    for(long long d=2;d*d<=n;d++)
        if(n%d==0){
            divs.push_back(d);

            while(n%d==0)
                n/=d;
        }
    if(n)
        divs.push_back(n);

    long long sol;
    long long step=1LL<<60;
    for(sol=0;step>0;step>>=1)
        if(countCoprimes(sol+step)<p)
            sol+=step;

    cout<<sol+1;

    return 0;
}