Cod sursa(job #2664513)

Utilizator teochess2017Togan Teodor-Bogdan teochess2017 Data 28 octombrie 2020 19:04:07
Problema GFact Scor 80
Compilator c-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <stdio.h>
#include <stdlib.h>

int v[2][10];

int cautare(int n, int i){
  int min, max, mij, cnt, ac, nrap;
  min = 0;
  max = n;
  while((max - min) > 1){
    mij = (min + max) / 2;
    ac = 0;
    nrap = 1;
    for(cnt = v[0][i]; cnt <= mij; cnt *= v[0][i]){
      ac = ac + (mij * nrap) / cnt;
      nrap++;
    }
    if((n - 1) < (mij + ac)){
      max = mij;
    }else{
      min = mij;
    }
  }
  return min;
}

int main()
{
    FILE *fin, *fout;
    int p, q, d, i, maxi, cnt, poz, ac, nrap;
    long long max;
    fin = fopen("gfact.in", "r");
    fscanf(fin, "%d%d", &p, &q);
    fclose(fin);
    d = 2;
    i = 0;
    while((d * d) <= p){
      if((p % d) == 0){
        v[0][i] = d;
        while((p % d) == 0){
          p /= d;
          v[1][i]++;
        }
        i++;
      }
      d++;
    }
    if(1 < p){
      v[0][i] = p;
      v[1][i] = 1;
      i++;
    }
    maxi = i;
    max = 0;
    for(i = 0; i < maxi; i++){
      v[1][i] *= q;
      poz = cautare(v[1][i] + 1, i);
      ac = 0;
      nrap = 1;
      for(cnt = v[0][i]; cnt <= poz; cnt *= v[0][i]){
        ac = ac + (poz * nrap) / cnt;
        nrap++;
      }
      if((poz + ac) < v[1][i]){
        poz++;
      }
      if(max < ((long long)poz * v[0][i])){
        max = (long long)poz * v[0][i];
      }
    }
    fout = fopen("gfact.out", "w");
    fprintf(fout, "%lld", max);
    fclose(fout);
    return 0;
}