Cod sursa(job #479318)

Utilizator vladtarniceruVlad Tarniceru vladtarniceru Data 23 august 2010 17:30:48
Problema GFact Scor 15
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.17 kb
# include <fstream>
# include <cstdio>
# define  LL  long long
using namespace std;
    LL P, Q, desc[100], cnt, du, d, ap[100], i, de[100], ap2[100], cnt2;
    
	LL des (LL P, LL desc[], LL 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){
			if (du%d==0){
			    desc[++cnt]=d;
		    	while (du%d==0){
			    	++ap[cnt];
			    	du=du/d;
			    }
			}
			d=d+2;
		}
	}
	
	LL corect (LL nr){
		//vezi de cate ori apare fiecare component in desc lui nr prin impartire
		//ok, let's start ... 
		LL i, aux, d;
		for (i=1;i<=cnt;++i){
			aux=0;
			d=nr;
			while (d%desc[i]==0){
				d=d/desc[i];
				aux+=d;
			}
			if (aux<ap[i]) return 0;
		}
		return 1;// :O
	}
	
	LL cb (LL in, LL sf){
		LL ret;
		while (in<=sf){
			int m= (in+sf) >> 1;
			if (corect (m)){//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);
		for (i=1;i<=cnt;++i) ap[i]=ap[i]*Q;
		printf ("%lld\n", cb (1, P*Q));
		return 0;
	}