Cod sursa(job #2701080)

Utilizator Paul281881818818181991919191881818Draghici Paul Paul281881818818181991919191881818 Data 29 ianuarie 2021 19:32:01
Problema GFact Scor 5
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 0.91 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<=sqrt(p); i+=2){
		if(ciur[i]==0){
			for(int j=i*i; j*j<=p; j+=i){
				ciur[j]=1;
			}
		}
	}
	pp[k++]=2;
	for(int i=1;i*i<=p;i++){
		if(ciur[i]){pp[k++]=i;}
	}
	int p1=p;
	int desc_p[NMAX]={0},exp_p[NMAX]={0};
	int h1=0;
	for(int i=0;i<k ;i++){
		int c=0;
		while(p1%pp[i]==0){
			c++;
			p1/=pp[i];
		}
		desc_p[h1]=pp[i],exp_p[h1]=c,h1++;
	}
	if(p1>1){h1++;desc_p[h1]=p1,exp_p[h1]=1;}
	
	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;
}