Cod sursa(job #883859)

Utilizator iuli1505Parasca Iuliana iuli1505 Data 20 februarie 2013 14:44:07
Problema Frac Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<cstdio>
#include<vector>
#define ll long long
using namespace std;
ll n,p,i,left,right,nf,j,mid,sol,SOL;
vector<ll>v[20];
vector<ll>::iterator it;
int main()
{
    freopen("frac.in","r",stdin);
    freopen("frac.out","w", stdout);
    scanf("%lld %lld ", &n, &p);
    v[0].push_back(1);
    for(i=2;i*i<=n&&n!=1;i++)
        if(n%i==0)
        {
            for(;n%i==0;n/=i);
            for(j=nf;j>=0;j--)
                for(it=v[j].begin();it!=v[j].end();it++)
                    v[j+1].push_back((*it)*i);
            nf++;
        }
    if(n>1)
    {
        for(j=nf;j>=0;j--)
            for(it=v[j].begin();it!=v[j].end();it++)
                v[j+1].push_back((*it)*n);
        nf++;
    }
    left=1;
    right=(long long)1<<62;
    for(;left<=right;)
    {
        mid=(left+right)/2;
        sol=mid;
        for(j=1;j<=nf;j+=2)
            for(it=v[j].begin();it!=v[j].end();it++)
                sol-=mid/(*it);
        for(j=2;j<=nf;j+=2)
            for(it=v[j].begin();it!=v[j].end();it++)
                sol+=mid/(*it);
        if(sol>=p){SOL=mid;right=mid-1;}
        else{left=mid+1;}

    }
    printf("%lld", SOL);

    return 0;
}