Cod sursa(job #361277)

Utilizator tamas_iuliaTamas Iulia tamas_iulia Data 4 noiembrie 2009 13:50:17
Problema Zero 2 Scor 89
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include <stdio.h>
#include <values.h>
#include <string.h>
#include <math.h>
#define X 20
#define LL unsigned long long
// E(n) = 1! * 2! * ... *n!
// Nr(n,p) = puterea la care apare p in E(n)
// S(n,p) = [n / p] + [(n-1)/p] + .. + [1/p]
// Nr(n,p) = S(n,p) + S(n,p^2) + ..

int n,B,t;
LL p[X],e[X]; int z;

void factorizez(int B){
	int i; z=0;
   memset(e,0,sizeof(e));
   if( B % 2 == 0){
   	p[++z]=2;
      while(B % 2 ==0) B /=2, e[z]++;
   }
   for(i=3; i<=sqrt(B); i+=2)
   if( B % i == 0){
   	p[++z]=i;
      while(B % i ==0) B /=i, e[z]++;
   }
   if(B>1) p[++z]=B, e[z]=1;
}

void solve(int n,int B){
	int i,k; LL pr,nr,min;
    min = 0;
   factorizez(B);
   for(i=1; i<=z; ++i){ // pt fiecare factor prim
   	nr =0;
      for(pr=p[i];  n/pr > 0; pr *=p[i] ){
      	k = n/pr -1;
      	nr += k*(k+1)/2 *pr + (k+1)*(n-(k+1)*pr +1);
      }
      if(min == 0) min = nr/e[i]; else
      if( nr / e[i] < min) min=nr/e[i];
   }

   printf("%lld\n",min);
}

int main(){
	freopen("zero2.in","r",stdin);
   freopen("zero2.out","w",stdout);
   for(t=10; t; --t){
   	scanf("%d%d",&n,&B);
      solve(n,B);
   }

   fclose(stdin); fclose(stdout);
   return 0;
}