Cod sursa(job #3341791)

Utilizator ana.veronica13Ana Veronica Draghici ana.veronica13 Data 21 februarie 2026 00:06:04
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>

using namespace std;

const long long MAX = 1LL << 61;

vector <long long> d;

long long check( long long val, vector <long long> &d ){
    long long ans, p, cnt, i, b;
    ans = 0;
    for( i = 1; i < ( 1LL << d.size() ); i++ ){
        p = 1;
        cnt = 0;
        for( b = 0; b < d.size(); b++ ){
            if( ( i & ( 1LL << b )) ){
                p *= d[b];
                cnt++;
            }
            if( p > val )
              break;
        }
        if( b == d.size() ){
            if( cnt % 2 == 1 )
              ans += val / p;
            else if( cnt > 0 )
              ans -= val / p;
        }
    }
    return val - ans;
}

long long cb( long long st, long long dr, long long p ){
    long long mid, ans = dr;
    while( st <= dr ){
        mid = ( st + dr ) / 2;
        if( check(mid, d) >= p ){
            ans = mid;
            dr = mid - 1;
        }
        else
          st = mid + 1;
    }
    return ans;
}

int main(){
    ifstream cin( "frac.in" );
    ofstream cout( "frac.out" );
    long long n, i, p;
    cin >> n >> p;
    i = 2;
    while( i * i <= n ){
        if( n % i == 0 ){
            d.push_back( i );
            while( n % i == 0 )
              n /= i;
        }
        i++;
    }
    if( n > 1 )
      d.push_back(n);
    cout << cb( 1, MAX, p );
    return 0;
}