Cod sursa(job #3301879)

Utilizator andreidumitrache1709Dumitrache Andrei Bogdan andreidumitrache1709 Data 30 iunie 2025 22:03:39
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <bits/stdc++.h>
#define MAXP 11
using namespace std;
int p[MAXP + 1] , len;
long long check( long long nr ) {
    int i , j , bits;
    long long ans , prod;
    ans = 0;
    for( i = 1 ; i < ( 1 << len ) ; i++ ) {
        prod = 1;
        bits = 0;
        for( j = 0 ; ( 1 << j ) <= i ; j++ )
            if( i & ( 1 << j ) ) {
                bits++;
                prod *= p[j];
            }
        if( bits % 2 == 1 )
            ans += nr / prod;
        else if( bits > 0 )
            ans -= nr / prod;
        if( nr == 10 )
            cout << i << ' ' << bits << ' ' << prod << '\n';
    }
    return nr - ans;
}
int main() {
    ifstream cin( "frac.in" );
    ofstream cout( "frac.out" );
    int d , e;
    long long n , st , dr , mij , limit;
    cin >> n >> limit;
    d = 2;
    len = 0;
    while( d * d <= n ) {
        e = 0;
        while( n % d == 0 ) {
            n /= d;
            e++;
        }
        if( e )
            p[len++] = d;
        d++;
    }
    if( n > 1 )
        p[len++] = n;
    st = 0;
    dr = ( 1LL << 61 ) + 1;
    while( dr - st > 1 ) {
        mij = ( st + dr ) / 2;
        if( check( mij ) >= limit )
            dr = mij;
        else
            st = mij;
    }
    cout << dr << '\n';
    return 0;
}