Cod sursa(job #2037312)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 11 octombrie 2017 23:41:08
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <cstdio>
#define BIG 9223372036854775807
using namespace std;

char ciur[110001];
int prime[11000];
long long divi[20];
int k;

long long value(long long A){
    long long sol,p;
    int i,j,nr;
    sol=0;
    for(i=1;i<(1<<k);i++){
        p=1;
        nr=0;
        for(j=0;j<k;j++)
            if((1<<j)&i){
                p=1LL*p*divi[j+1];
                nr++;
            }
        if(nr%2==0)
            nr=-1;
        else
            nr=1;
        sol=sol+1LL*nr*(A/p);
    }
    sol=A-sol;
    return sol;
}

long long cauta(long long li, long long ls, long long BUN){
    long long mij,val;
    while(li<=ls){
        mij=(1LL*li+1LL*ls)/(1LL*2);
        val=value(mij);
        if(val>=BUN)
            ls=mij-1;
        else
            li=mij+1;
    }
    return ls+1;
}

int main(){
    FILE *fin, *fout;
    int i,j,pun,d;
    long long sol,P,B,x;
    fin=fopen("frac.in","r");
    fout=fopen("frac.out","w");
    for(i=2;i*i<=110000;i++)
        if(ciur[i]==0){
            for(j=i*i;j<=110000;j+=i)
                ciur[j]=1;
        }
    pun=0;
    for(i=2;i<=110000;i++)
        if(ciur[i]==0)
            prime[++pun]=i;
    fscanf(fin,"%lld %lld\n",&B,&P);
    k=0;
    pun=1;
    d=prime[pun];
    while(d*d<=B && B>1){
        if(B%d==0){
            divi[++k]=d;
            while(B%d==0)
                B/=d;
        }
        d=prime[++pun];
    }
    if(B>1)
        divi[++k]=B;
    x=cauta(1,BIG,P);
    fprintf(fout,"%lld\n",x);
    fclose(fin);
    fclose(fout);
    return 0;
}