Pagini recente » Cod sursa (job #3170348) | Cod sursa (job #1570185) | Cod sursa (job #1765342) | Cod sursa (job #1031601) | Cod sursa (job #881519)
Cod sursa(job #881519)
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
using namespace std;
int main()
{
FILE* f=fopen("gfact.in","r");
FILE* g=fopen("gfact.out","w");
int p,q;
fscanf(f,"%d%d",&p,&q);
if(p==1)
{
fprintf(g,"1");
return 0;
}
unsigned long long produs = (unsigned long long)p * (unsigned long long)q;
int puteri[50];
int val[50];
int n=0;
for(int i=2;i<=sqrt((float)p);i++)
{
if (p%i==0)
{
puteri[n]=0;
val[n]=i;
while(p%i==0)
{
puteri[n]++;
p/=i;
}
n++;
}
}
if(p > 1) {
val[n]=p;
puteri[n]=1;
n++;
}
for(int i=0;i<n;i++)
{
puteri[i]*=q;
}
for(int i=0;i<n;i++)
{
//fprintf(g,"%d %d\n",val[i],puteri[i]);
}
unsigned long long start=2;
unsigned long long stop=produs;
unsigned long long mijloc;
unsigned long long solutie=0;
while(stop>=start)
{
mijloc=(stop+start)/2;
bool gasit=false;
for(int i=0;i<n;i++)
{
unsigned long long k=0;
unsigned long long v = val[i];
while(v<=mijloc)
{
k+=mijloc/v;
v *= val[i];
if(k>=puteri[i])
{
break;
}
}
if(k<puteri[i])
{
gasit=true;
}
}
if(!gasit)
{
solutie = mijloc;
stop=mijloc-1;
}
else
{
start=mijloc+1;
}
}
if(solutie!=0)
{
fprintf(g,"%llu",solutie);
}
return 0;
}