Cod sursa(job #914819)

Utilizator stefanzzzStefan Popa stefanzzz Data 14 martie 2013 14:53:46
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <fstream>
#include <vector>
#include <math.h>
#define MAXSOL 2305843009213693952
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");

long long n,p,st=1,dr=MAXSOL,x,mij;
int nrdiv;
vector<long long> div;
vector<int> comb;

void divizori();
long long ireductibil(long long a);
bool nextcomb();

int main()
{
    f>>n>>p;
    divizori();
    nrdiv=div.size()-1;
    while(st<dr){
        mij=(st+dr)/2;
        x=ireductibil(mij);
        if(x>=p)
            dr=mij-1;
        else
            st=mij+1;}
    while(ireductibil(st)<p)
        st++;
    g<<st<<'\n';
    f.close();
    g.close();
    return 0;
}

void divizori(){
    int i;
    for(i=2;i<=sqrt((double)n);i++){
        if(!(n%i)){
            div.push_back(i);
            while(!(n%i))
                n/=i;}}
    if(n>1)
        div.push_back(n);}

long long ireductibil(long long a){
    int i,j,semn=1;
    long long sol,produs;
    sol=a;
    for(i=1;i<=nrdiv+1;i++){
        semn*=(-1);
        comb.clear();
        for(j=0;j<i;j++)
            comb.push_back(j);
        do{
            produs=1;
            for(j=0;j<i;j++)
                produs*=div[comb[j]];
            sol+=(a/produs)*semn;}
        while(nextcomb());}
    return sol;}

bool nextcomb(){
    int it=comb.size()-1;
    while(it>=0&&comb[it]==nrdiv-comb.size()+1+it)
        it--;
    if(it<0)
        return 0;
    comb[it]++;
    for(it=it+1;it<comb.size();it++)
        comb[it]=comb[it-1]+1;
    return 1;}