Pagini recente » Problema satisfiabilităţii formulelor logice de ordinul doi | Cod sursa (job #2901076) | Algoritmiada 2013 - Clasament general, Clasele 11-12 | Monitorul de evaluare | Cod sursa (job #388645)
Cod sursa(job #388645)
#include<stdio.h>
#define LL long long
const LL N=1050,M=(LL)1<<61;
LL n,p,pr[N],nr,poz,u[N];
bool b[N];
void prec()
{
for( LL i=2 ; i*i<=n ; ++i )
if( n%i==0 )
{
while(n%i==0)
n/=i;
pr[++nr]=i;
}
if(n!=1)
pr[++nr]=n;
}
void read()
{
scanf("%lld%lld",&n,&p);
prec();
}
void ad( int uso )
{
LL a=1;
if(uso==0)
return;
for( int i=1 ; i<=nr ; ++i )
if( b[i]==1 )
a*=pr[i];
if( uso%2==1 )
a*=-1;
u[++poz]=a;
}
void back( int x , int uso )
{
if(x>nr)
{
ad(uso);
return;
}
b[x]=0;
back(x+1,uso);
b[x]=1;
back(x+1,uso+1);
}
LL check(LL x)
{
LL rez=x;
for( int i=1 ; i<=poz ; ++i )
rez+=x/u[i];
return rez;
}
LL caut()
{
LL i,step = M;
for( i=0 ; step ; step>>=1 )
if( check(i+step)<p )
i+=step;
return i+1;
}
int main()
{
freopen("frac.in","r",stdin);
freopen("frac.out","w",stdout);
read();
back(1,0);
printf("%lld",caut());
return 0;
}