Cod sursa(job #371249)

Utilizator iulia609fara nume iulia609 Data 4 decembrie 2009 17:56:53
Problema GFact Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include<stdio.h>

#define dim 100
//#define dim1 30001
using namespace std;

long long v[dim], w[dim], b[dim], i,val,nr,put; 

long long numarare(long long val, long long nr)    //si asta face bine :D
{
    long long n = 0;
    while (nr > 0)
    {
        n += nr / val;
        nr /= val;
    }
    return n;
}


long long cb(long long in, long long sf, long long num)		// in mare sper ca e corect, pare sa faca bine
{
    long long mij, r, sol;
    
    while (in <= sf)
    {
        mij = (in + sf) / 2;
        r = numarare(v[num], mij);
        if (r >= w[num])
            sol = mij, sf = mij-1;
        else
            in = mij+1;
    }
    return sol;
}


int main()
{ long long p,q,p1,t,k,r,i,max;
	
	freopen("gfact.in", "r", stdin);
	freopen("gfact.out", "w", stdout);
		
	scanf("%lld %lld", &p, &q);
	
	if(p == 1) 
    {
        printf("1\n");
        return 0;
    }
	else if(p == 0)
    {
        printf("0\n");
        return 0;
    }
    
	p1 = p; t = 0;						//verificat, merge bine --
	for(k = 2; k*k <= p1; k++)			
		{ r = 0;				
		  while(p % k == 0) r++, p /= k;
		  if(r != 0) v[++t] = k, w[t] = r*q;
		}									// --
    if( p != 1 ) v[++t] = p, w[t] = q;
	for( i = 1; i <= t; i++ )	//ar merge
		 b[i] = cb(1, ((long long)1<<60), i);
		

	max = 0;						// face cum trebuie, logic...
	for( i = 1; i <= t; i++ )
		{
		 if(b[i] > max) max = b[i];
		}
		
	printf("%lld\n", max);
	
	return 0;	
}