Cod sursa(job #1800567)

Utilizator gorneanu.andreiFMI Gorneanu Andrei gorneanu.andrei Data 7 noiembrie 2016 21:35:42
Problema Frac Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <stdio.h>
#include <string.h>
#define MAX_CIUR 120000
char a[MAX_CIUR];
long long n,p,prim[MAX_CIUR],m,fact[MAX_CIUR],q;
    //GASESTE NUMERE PRIME IN INTERVALUL [2,10^6]
    void ciur(){

    int i , j;
    a[2] = 0;
    q = 0;
    for(i = 2;i <= MAX_CIUR; ++i){

        if(a[i] == 0){
            for(j = 2;j * i <= MAX_CIUR; ++j)
                a[i * j] = 1;

            ++q;
            prim[q] = i;
            }
    }
    }

    //DESCOMPUNE PE N IN FACTORI PRIMI PENTRU A AFLA MULTIMILE DE MULTIPLI
    void descompune(){
    int i = 1;
    m = 0;

        for(i = 1;i <= q; ++i)
            if(n % prim[i] == 0){
                fact[++m] = prim[i];

            while(n % prim[i] == 0)
                n = n / prim[i];
            }

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

    }

    //CALCULEAZA A1 U A2 U ... U An CU PINEX,APOI SCADE DIN NUMARUL TOTAL
    long long cautareBinara(){

    int i , j;
    long long mid , produs , left , right , rezultat , count , semn;
    left = 1;
    right = 1LL << 61;

    while(left < right){

            mid = (long long)(left + right) / 2;
            rezultat = mid;

        for(i = 1;i < (1 << m); ++i){
            count = (long long)0;
            produs = (long long)1;
            for(j = 0;j < m; ++j)
                if(i & (1 << j))
                {
                    produs = 1LL * produs * fact[j + 1];
                    ++count;
                }



            if(count % 2 == 1)
                semn = -1;
            else
                semn = 1;

                rezultat = rezultat + semn * 1LL * (mid / produs);
        }

        if(rezultat > p)
                right = mid - 1;
            else
            if(rezultat < p)
                left = mid + 1;
            else
            right = mid;
    }

    return left;
    }







int main()


{
    long long x;
    FILE *f , *g;
    int i;
    f=fopen("frac.in","r");
    g=fopen("frac.out","w+");
    fscanf(f,"%lli %lli",&n,&p);

    ciur();
    descompune();
    x = cautareBinara();
    fprintf(g,"%lli",x);
    return 0;

}