Cod sursa(job #2278072)

Utilizator gavra_bogdanBogdan Gavra gavra_bogdan Data 7 noiembrie 2018 11:28:07
Problema Frac Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.47 kb
#include <bits/stdc++.h>

using namespace std;
const int nmax=110000;
long long cmmdc(long long a,long long b)
{
    long long r=a%b;
    do
    {
        r=a%b;
        a=b;
        b=r;
    }
    while(b);
    return a;
}
bool ciur[nmax];
int prime[nmax];
int divprime[nmax];
void eciur()
{
    ciur[0]=1;
    ciur[1]=1;
    for(int i=4;i<=nmax;i+=2)
        ciur[i]=1;
    for(int i=3;i*i<=nmax;i+=2)
        if(ciur[i]==0)
        {
            for(int j=3;i*j<=nmax;j+=2)
                ciur[i*j]=1;
        }
}
void eprime()
{
    prime[0]=1;
    prime[1]=2;
    for(int i=3;i<=nmax;i+=2)
    {
        if(ciur[i]==0)
        {
            prime[0]++;
            prime[prime[0]]=i;
        }
    }
}

int main()
{
    ifstream cin("frac.in");
    ofstream cout("frac.out");
    long long nr,p,n;
    cin>>n>>p;
    eciur();
    eprime();
    nr=n;
    for(int i=1;i<=prime[0];i++)
    {
        if(prime[i]>n/2)
            break;
        if(n%prime[i]==0)
        {
            nr*=(prime[i]-1);
            nr/=prime[i];
        }
    }
    if(nr==n)
    {
        int k=p/n;
        cout<<p+k+k/p;
        return 0;
    }
    int exp=p/nr;
    if(p%nr==0)
        exp--;
    p%=nr;
    if(p==0)
        p=nr;
    int xz=0;
    for(int i=1;i<=n;i++)
    {
        if(cmmdc(i,n)==1)
            xz++;
        if(xz==p)
        {
            cout<<i+n*exp;
            return 0;
        }
    }
    return 0;
}