Pagini recente » Cod sursa (job #1520371) | Cod sursa (job #77372) | Cod sursa (job #445049) | Cod sursa (job #2263008) | Cod sursa (job #1800567)
#include <stdio.h>
#include <string.h>
#define MAX_CIUR 120000
char a[MAX_CIUR];
long long n,p,prim[MAX_CIUR],m,fact[MAX_CIUR],q;
//GASESTE NUMERE PRIME IN INTERVALUL [2,10^6]
void ciur(){
int i , j;
a[2] = 0;
q = 0;
for(i = 2;i <= MAX_CIUR; ++i){
if(a[i] == 0){
for(j = 2;j * i <= MAX_CIUR; ++j)
a[i * j] = 1;
++q;
prim[q] = i;
}
}
}
//DESCOMPUNE PE N IN FACTORI PRIMI PENTRU A AFLA MULTIMILE DE MULTIPLI
void descompune(){
int i = 1;
m = 0;
for(i = 1;i <= q; ++i)
if(n % prim[i] == 0){
fact[++m] = prim[i];
while(n % prim[i] == 0)
n = n / prim[i];
}
if(n > 1){
fact[1] = n;
m = 1;}
}
//CALCULEAZA A1 U A2 U ... U An CU PINEX,APOI SCADE DIN NUMARUL TOTAL
long long cautareBinara(){
int i , j;
long long mid , produs , left , right , rezultat , count , semn;
left = 1;
right = 1LL << 61;
while(left < right){
mid = (long long)(left + right) / 2;
rezultat = mid;
for(i = 1;i < (1 << m); ++i){
count = (long long)0;
produs = (long long)1;
for(j = 0;j < m; ++j)
if(i & (1 << j))
{
produs = 1LL * produs * fact[j + 1];
++count;
}
if(count % 2 == 1)
semn = -1;
else
semn = 1;
rezultat = rezultat + semn * 1LL * (mid / produs);
}
if(rezultat > p)
right = mid - 1;
else
if(rezultat < p)
left = mid + 1;
else
right = mid;
}
return left;
}
int main()
{
long long x;
FILE *f , *g;
int i;
f=fopen("frac.in","r");
g=fopen("frac.out","w+");
fscanf(f,"%lli %lli",&n,&p);
ciur();
descompune();
x = cautareBinara();
fprintf(g,"%lli",x);
return 0;
}