Cod sursa(job #2364063)

Utilizator PinkiePie1189Preoteasa Mircea-Costin PinkiePie1189 Data 3 martie 2019 20:48:25
Problema Frac Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.78 kb
#include <stdio.h>
#define MAXFACT 15


struct Combination {
    long long prod;
    int ordin;
};

void genComb(int level);

FILE *fin, *fout;

long long fact[MAXFACT + 1];
int numfact = 0;

Combination combs[(1 << MAXFACT) + 1];
int numcombs = 0;

int st[MAXFACT + 1];

long long curprod = 1;

int main() {

    fin = fopen("frac.in", "r");
    fout = fopen("frac.out", "w");

    long long n, p;

    fscanf(fin, "%lld%lld", &n, &p);

    for(long long i = 2; i * i <= n; i++) {
        if(n % i == 0) {
            fact[numfact++] = i;

            while(n % i == 0) {
                n /= i;
            }
        }
    }

    if(n > 1) {
        fact[numfact++] = n;
    }


    st[0] = -1;

    genComb(1);



    long long left = 1, right = (1LL << 60), last = 1;

    while(left <= right) {
        long long mid = (left + right) / 2;


        long long aux = 0;
        for(int i = 0; i < numcombs; i++) {
            if(combs[i].ordin % 2 == 0) {
                aux -= mid / combs[i].prod;
            } else {
                aux += mid / combs[i].prod;
            }
        }

        if(mid - aux >= p) {
            last = mid;
            right = mid - 1;
        } else {
            left = mid + 1;
        }
    }


    fprintf(fout, "%lld\n", last);




    fclose(fin);
    fclose(fout);
    return 0;
}


void genComb(int level) {
    if(level > 1 && level <= numfact + 1) {
        combs[numcombs].prod = curprod;
        combs[numcombs++].ordin = level - 1;
    }

    if(level <= numfact) {

        for(int i = st[level - 1] + 1; i < numfact; i++) {
            st[level] = i;
            curprod *= fact[i];
            genComb(level + 1);
            curprod /= fact[i];
        }
    }
}