Cod sursa(job #1025386)

Utilizator maritimCristian Lambru maritim Data 9 noiembrie 2013 21:17:41
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<iostream>
#include<fstream>
using namespace std;

ifstream f("frac.in");
ofstream g("frac.out");

#define ll long long
#define MaxDiv 100
#define mid ((li+ls)/2)

ll N,P,nrDiv,globalSum;
int Div[MaxDiv];

void descompunere(ll N)
{
    ll a = N;

    for(ll i=2;i*i <= a && N > 1;i++)
        if(N%i == 0)
        {
            Div[++nrDiv] = i;
            for(;N%i == 0;N/=i);
        }

    if(N > 1)
        Div[++nrDiv] = N;
}

inline void back(int k,int P,int last,ll S,ll prod,ll val)
{
    if(k == P+1)
    {
        globalSum += prod*(val/S);

        return ;
    }

    for(int i=last+1;i<=nrDiv;i++)
        back(k+1,P,i,S*Div[i],prod,val);
}

inline ll pinex(ll val)
{
    globalSum = 0;

    for(int i=1;i<=N;i++)
        back(1,i,0,1LL,(i&1) ? 1LL : -1LL,val);

    return globalSum;
}

inline ll cautBin(ll li,ll ls)
{
    if(li > ls)
        return li;

    //cout << li << " " << ls << "\n";

    ll numar = mid-pinex(mid);

    //cout << mid << " " << numar << "\n";

    if(numar >= P)
        return cautBin(li,mid-1);
    else
        return cautBin(mid+1,ls);
}

int main()
{
    f >> N >> P;

    descompunere(N);

    //g << cautBin(2LL,(1LL<<61)-10LL);
}