Cod sursa(job #3236147)

Utilizator Andrei2000Andrei Mihailescu Andrei2000 Data 26 iunie 2024 14:34:10
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("frac.in");
ofstream fout("frac.out");

long long int numco(long long int a, long long int b){
    cout<<a<<" "<<b<<endl;
    vector<long long int> v;
    if(b%2 == 0){
        v.push_back(2);
        while(b%2 == 0)b/=2;
    }
    long long int i = 3;
    while(i*i <= b){
        if(b%i == 0){
            v.push_back(i);
            while(b%i == 0)b/=i;
        }
        i+=2;
    }
    if(b>1)v.push_back(b);

    int n=v.size();
    for(auto x:v)cout<<x<<" ";
    cout<<endl;
    long long int mini=1, maxi=(1<<n)-1, ans=0;
    for(int i=mini;i<=maxi;++i){
        long long int pr=1, nr=0;
        for(int j=0;j<n;++j){
            if (i&(1<<j)){
                pr*=v[j];
                nr++;
            }
        }
        ans+= (a/pr) * (nr%2?1:-1);
    }
    cout<<a-ans;
    cout<<endl;
    cout<<endl;
    return a-ans;
}

int main()
{
    long long int n,p,mini=1,maxi=2LL<<61;
    fin>>n>>p;
    long long int res, f, nc;
    while (mini<=maxi){
        res = (mini+maxi)/2;
        nc = numco(res, n);
        if(nc>p){
            maxi=res-1;
        }
        else if (nc<p){
            mini=res+1;
        }
        else if(nc==p){
            f=res;
            maxi=res-1;
        }
    }
    fout<<f<<endl;

    return 0;
}