Cod sursa(job #369161)

Utilizator Cristi09Cristi Cristi09 Data 27 noiembrie 2009 12:56:14
Problema Frac Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<stdio.h>
//#include<dos.h>
//#include<time.h>
//#include<conio.h>
long long n,p,per,lo=0,hi,mid,var,in;
//clock_t start,end;
int verif(long long x);
long long det();
long long cautbin();
int main()
{
  // clrscr();
   //start=clock();
   FILE*f=fopen("frac.in","r");
   fscanf(f,"%lld%lld",&n,&p);
   fclose(f);

   FILE*g=fopen("frac.out","w");
   fprintf(g,"%lld",cautbin());
   fclose(g);
   //end=clock();
   //printf("%f",(end-start)/CLK_TCK*1000);
   return 0;
}
int verif(long long x)
{
   long long a,b,r;
   a=n;
   b=x;
   r=a%b;
   while(r)
   {
	 a=b;b=r;r=a%b;
   }
   //if(b>1)return 0;
   //return 1;
   return (!(b-1));
}
long long det()
{
	long long sd=mid,contor=0;
	int c;
	if(n%2==0)c=2;
	else c=1;
	if(sd%2==0&&c%2==0)--sd;
	var=0;
	for(sd;sd>=in&&contor<=p;sd-=c)
	if(verif(sd))
	{++contor;if(!var)var=sd;}

	return contor;
}
long long cautbin()
{
   hi=4000000000;in=1;
   long long q;
   while(lo<=hi)
   {
	 mid=lo+(hi-lo)/2;

	 q=det();
	 if(q==p)lo=hi+1;
	 if(q>p)hi=mid-1;
	 if(q<p){p-=q;in=mid;lo=mid+1;}
   }

   return var;
}