Cod sursa(job #2222504)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 17 iulie 2018 10:09:35
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.65 kb
#include <bits/stdc++.h>
using namespace std;
long long cmmdc(long long a,long long b)
{
    long long r;
    while(b)
    {
        r=a%b;
        a=b;
        b=r;
    }
    return a;
}
int v[155];
int cnt;
long long a[15][2000];
int main()
{
    freopen("frac.in","r",stdin);
    freopen("frac.out","w",stdout);
    long long n ,k;
    scanf("%lld%lld",&n,&k);
    long long r=n,t1=n;
    long long d=2,e=0;
    while(d*d<=r)
    {
        while(r%d==0)
        {
            e++;
            r/=d;
        }
        if(e)t1*=(d-1),t1/=d;
        if(e)v[++cnt]=d;
        d++;
        e=0;
    }
    if(r>1)
        t1*=(r-1),v[++cnt]=r,t1/=r;
    k--;
    long long sol=(k/t1)*n;
    k%=t1;
    k++;
    long long prod=1;
    int nr=(1<<cnt);
    int i;
    for(i=1;i<nr;i++)
    {
        prod=1;
        int c=0;
        int j;
        for(j=0;j<cnt;j++)
        {
            if(i&(1<<j))
            {
                c++;
                prod*=v[cnt-j];
            }
        }
        a[c][++a[c][0]]=prod;
    }
    long long st=1,dr=n;
    long long l=0;
    while(st<=dr)
    {
        long long med=(st+dr)/2;
        long long nr1=med;
        for(int i=1;i<=13;i++)
            {if(a[i][0]==0)break;
            int j;
            for(j=1;j<=a[i][0];j++)
                if(i%2==0)nr1+=med/a[i][j];
            else
                nr1-=med/a[i][j];
            }
            if(nr1<k)st=med+1;
            if(nr1>k)dr=med-1;
            if(nr1==k)
            {
                l=med;
                dr=med-1;
            }

    }
    sol+=l;
    printf("%lld\n",sol);
    return 0;
}