Cod sursa(job #1506429)

Utilizator BLz0rDospra Cristian BLz0r Data 20 octombrie 2015 17:46:25
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;

FILE *f = fopen ( "frac.in", "r" );
FILE *g = fopen ( "frac.out", "w" );

vector < int > Divs;

int main(){

    long long N, P, cN;
    vector < int > :: iterator it;

    fscanf ( f , "%lld%lld", &N, &P );
    cN = N;

    for ( int i = 2; i * i <= cN; ++i ){
        if ( cN % i == 0 ){
            Divs.push_back(i);
            while ( cN % i == 0 )
                cN /= i;
        }
    }
    if ( N % cN == 0 )
        Divs.push_back(cN);

    long long NrDiv = Divs.size(), total =( 1LL << NrDiv ) - NrDiv;
    long long st = 1, dr = 100, sum;//( 1LL << 61 ), sum;

    while ( st <= dr ){
        long long mid = ( st + dr ) >> 1;
        bool ok = 1;
        sum = 0;

        for ( it = Divs.begin(); it != Divs.end(); ++it ){
            if ( mid % *it == 0 )
                ok = 0;
            sum += ( mid / *it );
        }
        sum -= total;

        if ( ok && mid - sum == P ){
            fprintf ( g, "%lld", mid );
            return 0;
        }

        if ( mid - sum >= P )
            dr = mid - 1;
        else
            st = mid + 1;
    }


    return 0;
}