Cod sursa(job #1219434)
Utilizator | Mihai Musat mihaimusat | Data | 14 august 2014 10:38:34 |
---|---|---|---|
Problema | Frac | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 0.92 kb |
#include <fstream>
using namespace std;
ifstream f("frac.in");
ofstream g("frac.out");
long long t,a,b,n,i,j,cnt,k,last,sol,p,dr,st,mid,pp;
long long v[100005];
int main() {
f>>b>>pp;
n=0;
for(i=2;i*i<=b;i++) {
if(b%i==0)
v[++n]=i;
while(b%i==0) {
b/=i;
}
}
if(b!=1)
v[++n]=b;
last=(1LL<<n)-1;
st=1;dr=(1LL<<60)+1;
while(st<=dr) {
mid=st+(dr-st)/2;
sol=mid;
for(i=1;i<=last;i++) {
cnt=0;p=1;
for(j=0;j<n;j++)
if(((i>>j)&1LL)==1LL) {
cnt++;
p*=v[j+1];
}
if(cnt%2==0)
sol+=mid/p;
else
sol-=mid/p;
}
if(sol>=pp)
dr=mid-1;
else
st=mid+1;
}
g<<st<<"\n";
return 0;
}