Cod sursa(job #479345)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 23 august 2010 18:51:14
Problema GFact Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
# include <fstream>
# include <cstdio>
# define  lint  long long
using namespace std;
	lint P, Q, desc[100], cnt, du, d, ap[100], i, de[100], ap2[100], cnt2, afis, var, valoare;
    
	lint des (lint P, lint desc[], lint ap[]){
		du=P;
		cnt=0;
		if (du%2==0){
			desc[++cnt]=2;
			while (du%2==0){
				++ap[cnt];
				du>>=1;
			}
		}
		d=3;
		while (du>1 && d*d<=P){
			if (du%d==0){
			    desc[++cnt]=d;
		    	while (du%d==0){
			    	++ap[cnt];
			    	du=du/d;
			    }
			}
			d=d+2;
		}
		if (du>1){//inseamna ca a ramas nr prim
			desc[++cnt]=du;
			++ap[cnt];
		}
	}
	
	lint corect (lint nr, lint put){
		//vezi de cate ori apare fiecare component in desc lui nr prin impartire
		//ok, let's start ... 
		lint ret=0;
		while (nr){
			nr/=put;
			ret+=nr;
		}
		return ret;
	}
	
	lint cb (lint in, lint sf, lint i){
		lint ret;
		while (in<=sf){
			int m= (in+sf) >> 1;
			if (corect (m, desc[i])>=ap[i]){//search down
				ret=m;
				sf=m-1;
			}
			else in=m+1;//else up
			
		}
		return ret;
	}
	
	int main (){
		ifstream f ("gfact.in");
		freopen ("gfact.out", "w", stdout);
		f>>P>>Q;
		des (P, desc, ap);
		valoare=1LL << 60;
		for (i=1;i<=cnt;++i){
			ap[i]=ap[i]*Q;
			var=cb (1, valoare, i);
			if (afis<var) afis=var;
		}
		printf ("%lld\n", afis);
		return 0;
	}