Cod sursa(job #1988552)

Utilizator andreiutu111Noroc Andrei Mihail andreiutu111 Data 3 iunie 2017 13:33:53
Problema Zero 2 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("zero2.in");
ofstream g("zero2.out");
int N,B,Bputere[10001],Numere[10001],nr;
bool u[10001];
void ciur(){
    for(int i=2;i<=10000;++i)
        if(!u[i]){
            int j=1;
            while(i*j<=10000)u[i*j]=1,++j;
        }
}
void descompNum(int y[],int U,int &mAx){
        int f=2,x=U;
        while(f*f<=x){
            if(!(U%f)){
                mAx=max(mAx,f);
                while(!(U%f))U/=f,++y[f];
            }
            if(f==2)++f;
            else f+=2;
        }
        if(U>1)++y[U],mAx=U;
}
int main()
{
    while(f>>N>>B){
        if(B==10){
            nr=0; int p=5;
            while(N/p)nr+=(N/p),p*=p;
            g<<nr<<"\n";
        }else{
            ciur();
            bool q=1;
            int MaxB=0,MaxN=0;
            if(!u[B])++Bputere[B],MaxB=max(MaxB,B),q=0;
            else descompNum(Bputere,B,MaxB);
            for(int i=2;i<=N;++i)
                for(int j=2;j<=i;++j)
                    if(!u[j])++Numere[j],MaxN=max(MaxN,j);
                    else descompNum(Numere,j,MaxN);
            nr=999999999;
            if(!q)nr=min(nr,Numere[B]/Bputere[B]);
            else{
                for(int i=2;i<=MaxB;++i)
                    if(Bputere[i])nr=min(nr,Numere[i]/Bputere[i]),Bputere[i]=0;
            }
            memset(Numere,0,sizeof(Numere));
            g<<nr<<"\n";
        }
    }
    return 0;
}