-
Notifications
You must be signed in to change notification settings - Fork 59
/
Copy pathfrac.cpp
71 lines (71 loc) · 1.23 KB
/
frac.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
int VV,i,j,nrdiv,nr;
int fact[100005];
long long ci,cs,mij,prod,n,p,var,sol;
struct elem
{
long long prod;
int nr;
}E,grup[1000005];
void grupe (int k)
{
if (k==nrdiv+1)
{
if (prod!=1)
{
grup[++VV].nr=nr;
grup[VV].prod=prod;
}
}
else
{
//nu il iau
grupe (k+1);
//il iau
prod*=fact[k]; ++nr;
grupe(k+1);
prod/=fact[k]; --nr;
}
}
long long numarare (long long mij)
{
long long R=0;
for (int i=1; i<=VV; ++i)
{
if (grup[i].nr%2==1) R+=mij/grup[i].prod;
else R-=mij/grup[i].prod;
}
return mij-R;
}
int main ()
{
f>>n>>p;
var=n;
for (i=2; i*i<=var; ++i)
{
if (var%i==0)
{
fact[++nrdiv]=i;
while (var%i==0)
var=var/i;
}
}
if (var!=1) fact[++nrdiv]=var;
prod=1;
grupe (1);
//cautarea binara
ci=1; cs=1;
for (i=1; i<=61; ++i)
cs=cs*2;
while (ci<=cs)
{
mij=(ci+cs)/2;
if (numarare(mij)>=p) sol=mij,cs=mij-1;
else ci=mij+1;
}
g<<sol<<"\n";
return 0;
}