Cod sursa(job #1702928)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 15 mai 2016 20:03:19
Problema Divizori Primi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <cstdio>
#define MAXN 1000000
#define MAXK 7
char nrdiv[MAXN+1];
int mat[MAXN+2][MAXK+1],prim[MAXN+1];
int main(){
    FILE*fi,*fout;
    int i,j,n,k,nr,x,t,aux;
    fi=fopen("divprim.in" ,"r");
    fout=fopen("divprim.out" ,"w");
    for(i=2;i*i<=MAXN;i++)
      if(prim[i]==0)
        for(j=2*i;j<=MAXN;j+=i)
            prim[j]=i;
    for(i=2;i<=MAXN;i++){
        nr=i;
        if(prim[nr]==0)
           nrdiv[i]=1;
        else{
           aux=-1;
           while(prim[nr]>0){
              if(aux!=prim[nr])
                 nrdiv[i]++;
              aux=prim[nr];
              nr=nr/prim[nr];
          }
          if(aux!=nr)
             nrdiv[i]++;
        }
    }
    for(i=1;i<=MAXK;i++){
         j=MAXN;
         mat[j+1][i]=MAXN+1;
         while(j>1){
             if(mat[j+1][i]<=j)
                mat[j][i]=mat[j+1][i];
             else{
                 x=j;
                 while(x>0&&nrdiv[x]!=i)
                    x--;
                 mat[j][i]=x;
             }
             j--;
         }
    }
    fscanf(fi,"%d" ,&t);
    while(t>0){
        t--;
        fscanf(fi,"%d%d" ,&n,&k);
        if(k==0)
           fprintf(fout,"1\n");
        else
           fprintf(fout,"%d\n" ,mat[n][k]);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}