Cod sursa(job #3185296)

Utilizator DeriusSaila Darius Derius Data 18 decembrie 2023 17:55:56
Problema GFact Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.71 kb
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,np;
}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, ll 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;
}