Cod sursa(job #443227)

Utilizator nandoLicker Nandor nando Data 16 aprilie 2010 15:09:52
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>
using namespace std;

FILE* fin=fopen("gfact.in","r");
FILE* fout=fopen("gfact.out","w");

typedef unsigned long long uint64;

uint64 p,q,decomp[30][2],nf=0;

inline uint64 num(uint64 a,uint64 k){
	uint64 nr=0;
	for(uint64 i=a;i<=k;i*=a){
		nr+=k/i;
	}
	return nr;
}

inline uint64 search(uint64 a,uint64 b){
	uint64 beg=0LL,end=8446744073709551615LL,last=0LL,mdl;
	
	while(beg<=end){
		mdl=beg+((end-beg)>>1LL);
		if(num(a,mdl)>=b){
			last=mdl,end=mdl-1LL;
		}else{
			beg=mdl+1LL;
		}

	}
	return last;
}

int main(){

	fscanf(fin,"%llu %llu\n",&p,&q);
	
	for(uint64 i=2,k;i*i<=p;++i){
		if(p%i==0){
			k=0;
			while(p%i==0){
				k++,p/=i;
			}
			decomp[nf][0]=i;
			decomp[nf][1]=k*q;
			nf++;
		}
	}

	if(p>1){
		decomp[nf][0]=p;
		decomp[nf][1]=q;
		nf++;
	}

	uint64 maxv=0,c=0;

	for(uint64 i=0;i<nf;i++){
		c=search(decomp[i][0],decomp[i][1]);
		if(maxv<c){
			maxv=c;	
		}
	}

	fprintf(fout,"%llu ",maxv);

	fclose(fin);
	fclose(fout);
	return 0;
}