Cod sursa(job #1909686)

Utilizator rebecca0312Andrei Rebecca rebecca0312 Data 7 martie 2017 13:34:00
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include<cstdio>
using namespace std;
const int NMAX=50;
struct DESC{
	int baza,exponent;
};
DESC v[NMAX];
void descompunere(int n, int &ind){
	for(int i=0;i<=ind;i++)
		v[i].baza=v[i].exponent=0;
	int d=2;
	ind=0;
	while(d*d<=n && n>1){
		if(n%d==0){
			v[++ind].baza=d;
			while(n%d==0){
				v[ind].exponent++;
				n/=d;
			}
		}
		d++;
	}
	if(n>1){
		v[++ind].baza=n;
		v[ind].exponent=1;
	}
}
long long legendre(int k, long long n){
	long long numitor=k,s=0;
	while(numitor<=n){
		s+=n/numitor;
		numitor*=k;
	}
	return s;
}
long long bs(int poz){
	long long st,med,dr,last=0,ans;
	int k=v[poz].baza;
	st=1;
	dr=(1LL<<62);
	while(st<=dr){
		med=dr-(dr-st)/2;
		ans=legendre(k, med);
		if(ans>=v[poz].exponent){
			last=med;
			dr=med-1;
		}
		else
			st=med+1;
	}
	return last;
}
int main(){
    freopen("gfact.in","r",stdin);
    freopen("gfact.out","w",stdout);
    int ind=0,p,q,poz=0,i;
    long long maxx=-1;
	scanf("%d%d", &p, &q);
	if(p!=1){
		descompunere(p, ind);
		for(i=1;i<=ind;i++)
			v[i].exponent*=q;
		for(i=1;i<=ind;i++){
			long long nr=bs(i);
			if(nr>maxx)
				maxx=nr;
		}
		printf("%lld", maxx);
	}
	else
		printf("0");
    return 0;
}