Cod sursa(job #2070485)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 19 noiembrie 2017 16:54:20
Problema Frac Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include<cstdio>
using namespace std;

long long fact[1005];
int nrfact;

void descompunere(long long n){
    if(n%2==0){
        fact[++nrfact]=2;
        while(n%2==0)
            n/=2;
    }
    for(int d=3;d*d<=n && n>1;d++)
        if(n%d==0){
            fact[++nrfact]=d;
            while(n%fact[nrfact]==0)
                n/=fact[nrfact];
        }
    if(n>1)
        fact[++nrfact]=n;
}

bool cautare(long long prod){
    for(int i=1;i<=nrfact;i++)
        if(fact[i]==prod)
            return 1;
    return 0;
}

int main(){
    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);
    long long n,p,valoare=1;
    scanf("%lld%lld", &n, &p);
    descompunere(n);
    for(int i=1;i<=nrfact;i++)
        valoare*=fact[i];
    long long indice_euler=valoare;
    for(int i=1;i<=nrfact;i++){
        indice_euler*=fact[i]-1;
        indice_euler/=fact[i];
    }
    long long cat=p/indice_euler,rest=p%indice_euler;
    bool ciur[valoare+5];
    for(int i=0;i<=valoare;i++)
        ciur[i]=0;
    for(int i=1;i<=nrfact;i++)
        for(int j=1;j*fact[i]<=valoare;j++)
            ciur[j*fact[i]]=1;
    long long nr=0,element=1;
    if(rest==0)
        rest=indice_euler,cat--;
    while(nr<rest){
        if(ciur[element]==0)
            nr++;
        element++;
    }
    element--;
    printf("%lld", element+valoare*cat);
    return 0;
}