Pagini recente » Problema satisfiabilităţii formulelor logice de ordinul doi | Cod sursa (job #445866) | Cod sursa (job #809764) | Cod sursa (job #1131245) | Cod sursa (job #388639)
Cod sursa(job #388639)
#include<stdio.h>
long long n,p,nrp,prim[1<<4],prod[1<<10];
long long produs(long long x)
{
long long p=1;
for(int i=0 ; x ; ++i,x>>=1)
if(x&1)
p *= -prim[i];
return p;
}
void submultimi()
{
int i;
for(i=0 ; i<(1<<nrp) ; ++i)
prod[i] = produs(i);
}
long long f(long long x)
{
int i;
long long s=0;
for(i=0;i<(1<<nrp);++i)
s+=x/prod[i];
return s;
}
long long caut()
{
long long i,pas = (long long)1<<61;
for(i=0 ; pas ; pas>>=1)
if(f(i+pas)<p)
i+=pas;
return 1+i;
}
int main()
{
long long i;
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
scanf("%lld%lld",&n,&p);
for(i=2;i*i<=n;++i)
if(n%i==0)
{
while(n%i==0)
n/=i;
prim[nrp++]=i;
}
if(n!=1)
prim[nrp++]=n;
submultimi();
printf("%lld\n",caut());
return 0;
}