Pagini recente » Cod sursa (job #2639061) | Cod sursa (job #2760257) | Cod sursa (job #1545477) | Cod sursa (job #2733345) | Cod sursa (job #67033)
Cod sursa(job #67033)
using namespace std;
#define ll long long
#include <stdio.h>
#include <fstream>
FILE *fin=fopen("gfact.in","r"),
*fout=fopen("gfact.out","w");
typedef struct
{
ll n,p;
} data;
ll p;
int q,m;
ll b[50];
data d[50];
int pr[100000],a[100000],lim;
void generare()
{
int k,i;
int rad;
memset(pr,0,sizeof(pr));
rad=45000;
for (i=2; i<=rad/10; i++)
{
k=i*i;
while (k<=rad+2)
{
pr[k]=1;
k+=i;
}
}
k=1;
for (i=2; i<=rad+1; i++)
if (pr[i]==0) a[k++]=i;
lim=k-1;
}
void descompune()
{
int vl,i,j;
ll m1;
memset(d,0,sizeof(d));
j=0;
i=1;
m1=p;
while (m1!=1 && i<=lim)
if (m1%a[i]==0)
{
vl=0;
while (m1%a[i]==0)
{ vl++; m1/=a[i]; }
j++;
d[j].n=a[i];
d[j].p=vl;
} else i++;
if (m1!=1) { d[++j].n=m1; d[j].p=1; }
m=j;
for (i=1; i<=m; i++)
d[i].p*=q;
}
int power(ll a, int b)
{
int ct=0,c=b;
while (b<=a) { ct+=a/b; b*=c; }
return ct;
}
void cautafact()
{
int i,li,lf;
ll x,t,sol=0,mj=0;
for (i=1; i<=m; i++)
{
li=1; lf=d[i].p;
while (li<=lf)
{
mj=(li+lf)/2;
x=(long long)mj*(long long)d[i].n;
t=power(x,d[i].n);
if (t<d[i].p) li=mj+1;
if (t>d[i].p) lf=mj-1;
if (t==d[i].p) break;
}
b[i]=(long long)mj*(long long)d[i].n;
}
for (i=1; i<=m; i++)
if ((long long)b[i]>(long long)sol) sol=(long long)b[i];
fprintf(fout,"%lld\n",sol);
}
int main()
{
fscanf(fin,"%lld %d",&p,&q);
generare();
descompune();
cautafact();
fclose(fin); fclose(fout);
return 0;
}