Cod sursa(job #807155)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 4 noiembrie 2012 11:28:37
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <cstdlib>
#include <stdio.h>
#include <vector>
#define MAX (1LL << 62)
#include <math.h>

using namespace std;

vector <long long> diviz;
long solut[20000];
long long n;
long long p;
long long sum = 0;
long long prod = 1;
void prime(long long x,long last)
{

    for (long val=solut[last-1]+1;val<=diviz.size();val++)
    {
        solut[last] = val;
        prod *= diviz[solut[last]-1];
        sum += ((int)pow(-1,last-1) * (x / prod));
        prime(x,last+1);
        prod /= diviz[solut[last]-1];
    }


}

int main()
{
    FILE *input = fopen("frac.in","r");
    FILE *output = fopen("frac.out","w");
    fscanf(input,"%lld",&n);
    fscanf(input,"%lld",&p);

    long long div = 1;
    long long cpy = n;

    while (cpy != 1)
    {
        div++;
        if (cpy % div == 0)
        {
            diviz.push_back(div);
            while (cpy % div == 0)
            {
                cpy /= div;
            }
        }
    }
    long long st = 0;
    long long dr = MAX;
    long long sol = 0;
    while (st <= dr)
    {
        long long m = (st + dr ) / 2;
        solut[0]= 0;

        sum = 0;
        prod = 1;
        prime(m,1);
        sum = m - sum;
        if (sum >= p)
        {
            sol = m;
            dr = m-1;
        }
        else
        {
            st = m+1;
        }
    }
    fprintf(output,"%lld",sol);
    fclose(input);
    fclose(output);
    return 0;
}