Cod sursa(job #1024826)

Utilizator jul123Iulia Duta jul123 Data 9 noiembrie 2013 10:16:51
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<iostream>
#include<fstream>
#include<cmath>
using namespace std;
bool ciur[1000000];
int p = 0;
long long m;
long long k;
long long v[78498], w[78498];
void ciurul()
{

    long long p, nr=0, j, i, r;
    for(i = 2; i <= 1000000; i++)
             ciur[i] = true;
    r = 1000;
    for(p = 2; p <= r; p++)
    {
             if(ciur[p] == 1)
             for(j = p * p; j <= 1000000; j += p)
                      ciur[j] = false;
    }
    for(i = 2;i <= 1000000; i++)
                     if( ciur[i] == true)
                            {
                                v[nr] = i;
                                nr++;
                                }

}
void factori_primi()
{
    int  i = 0;
    while( v[i] * v[i] <= m)
    {
        if( m % v[i] == 0)
    {
    w[p] = v[i]; p++;
    while(m % v[i] == 0)
        m /= v[i];
    }
    i++;
    }
    if(m != 1)
        w[p++] = m;
}
long long fi( long long u)
{
    long long i,t,r,j;
    r = 1;
    long long s = 0;
    for(i = 0;i < (1<<p); i++)
        {   r = 1;
            t = 0;
            for(j = 0; j <= p - 1; j++)
            if((i>>j) % 2 == 1)
                {r *= w[j];
                t++;}
            if(t % 2 == 0)
                s += u / r;
            else
                s -= u / r;
        }
    return s;
}
long long binary_search()
{

    long long i, pas = (long long)1<<61;
    for(i = 0; pas; pas >>= 1)
    {
        if(( fi( i + pas)) <= k - 1)
            i += pas;
    }
    return i + 1;
}
int main()
{
 ifstream f("frac.in");
 ofstream g("frac.out");
 ciurul();
 f>>m>>k;
 factori_primi();
 g<<binary_search();
}