Cod sursa(job #328674)

Utilizator iulia609fara nume iulia609 Data 3 iulie 2009 00:52:22
Problema GFact Scor 85
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<stdio.h>
#define dim 500000
//#define dim1 30001
using namespace std;

long long v[dim], w[dim], b[dim], i,val,nr,put; 

long long numarare(long long val, long long put, long long nr)    //si asta face bine :D
{ int rez,val1;
	rez = 0; val1 = 1;
	for( i = 1; i <= put; i++ )
		{ val1 *= val;
		  rez += (int)( nr / val1 );
		  if( (int)nr / val1 == 0 ) break;
		}
	return rez;
}


long long cb(long long in, long long sf, long long num)		// in mare sper ca e corect, pare sa faca bine
{ long long mij,x,y;
	mij = (in + sf)>>1;
	
	x = mij * v[num];
	y = numarare(v[num], w[num], x);
	
	if( (y == w[num]) || (in == sf) || (in > sf))/*mij-1) || sf == mij+1)*/ return x;
		else if( y < w[num] ) return cb(mij+1, sf, num);
			else return cb(in, mij-1, num);	
}



int main()
{ long long p,q,p1,t,k,r,i,a,max;
	
	FILE *f = fopen("gfact.in", "r");
	FILE *g = fopen("gfact.out", "w");
	
	fscanf(f, "%lld%lld", &p, &q);
	
	p1 = p; t = 0;						//verificat, merge bine --
	for(k = 2; k*k <= p1; k++)			
		{ r = 0;		
		  while(p % k == 0) r++, p /= k;
		  if(r != 0) v[++t] = k, w[t] = r*q;
		}									// --
	 //if( t != 0 && p != 1) v[2] = p1/v[1], w[2] = q, t++;
		 if( p != 1 ) v[++t] = p, w[t] = q;
		
	for( i = 1; i <= t; i++ )	//ar merge
		{a = /*v[i] * */ 2*w[i];
		 b[i] = cb(1, a, i);
		}
		
	max = 0;						// face cum trebuie, logic...
	for( i = 1; i <= t; i++ )
		if(b[i] > max) max = b[i];
		
		
	fprintf(g, "%lld\n", max);
	
	fclose(f);
	fclose(g);
	return 0;	
}