Cod sursa(job #2701100)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 29 ianuarie 2021 20:23:49
Problema GFact Scor 65
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
	
#include <climits>
	
#include <cmath>
	
#define NMAX 45000
	
using namespace std;
	
ifstream cin("gfact.in");
	
ofstream cout("gfact.out");
	
int ciur[NMAX+15],pp[NMAX],k;
	
int main(){
	
	int p,q;
	
	cin >> p >> q;
	
	for(int i=3; i*i<=NMAX; i+=2){
	
		if(ciur[i]==0){
	
			for(int j=i*i; j<=NMAX; j+=i){
	
				ciur[j]=1;
	
			}
	
		}
	
	}
	
	pp[k++]=2;
	
	for(int i=3;i<=NMAX;i+=2){
	
		if(!ciur[i]){pp[k++]=i;}
	
	}
	
	int p1=p;
	
	//for(int i=0;i<k;i++){cout<<pp[i]<<" ";}
	
	long long int desc_p[NMAX]={0},exp_p[NMAX]={0},h1=0;
	
	for(int i=0;i<k && 1LL*pp[i]*pp[i]<=p;i++){
	
		int c=0;
	
		while(p1%pp[i]==0 && p1>0){
	
			c++;
	
			p1/=pp[i];
	
		}
	
		if(c>0 ){desc_p[h1]=pp[i],exp_p[h1]=c;h1++;}
	
		
	
	}
	
	
	
	if(p1>1){desc_p[h1]=p1,exp_p[h1]=1;h1++;}
	
	//for(int i=0;i<h1;i++){cout<<desc_p[i]<<" "<<exp_p[i]<<"   ";}
	
	long long int st=0,dr=LLONG_MAX,mid,mn;
	
	mn=dr;
	
	while( dr-st>1){
	
		mid= (st+dr) /2;long long int mid1=mid,s=0,mnn=LLONG_MAX;
	
		
	
		for(int i=0;i<h1;i++){
	
			
	
			while(mid1>0){
	
				mid1/=desc_p[i];
	
				s+=mid1;
	
			}
	
			
			if(mnn>(s/exp_p[i])){mnn=s/exp_p[i];}
			//mnn=min(mnn,s/exp_p[i]);
	
		}
	
		if(mnn>=q){mn=min(mn,mid);dr=mid;}
	
		
	
		else{st=mid;}
	
		
	
	}
	
	cout<<mn;
	
	return 0;
	
}