Cod sursa(job #2701091)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 29 ianuarie 2021 20:02:03
Problema GFact Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.06 kb
#include <fstream>
#include <climits>
#include <cmath>
#define NMAX 45000
using namespace std;
ifstream cin("gfact.in");
ofstream cout("gfact.out");
int ciur[NMAX],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<=p;i+=2){
		if(!ciur[i]){pp[k++]=i;}
	}
	int p1=p;
	//for(int i=0;i<k;i++){cout<<pp[i]<<" ";}
	int desc_p[NMAX]={0},exp_p[NMAX]={0};
	int h1=0;
	for(int i=0;i<k && 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]<<"   ";}
	int st=0,dr=INT_MAX,mid,mn;
	mn=dr;
	while( dr-st>1){
		mid= (st+dr) /2; int mid1=mid,s=0,mnn=INT_MAX;
		
		for(int i=0;i<h1;i++){
			
			while(mid1>0){
				mid1/=desc_p[i];
				s+=mid1;
			}
			
			mnn=min(mnn,s/exp_p[i]);
		}
		if(mnn>=q){mn=min(mn,mid);dr=mid;}
		
		else{st=mid;}
		
	}
	cout<<mn;
	return 0;
}