Cod sursa(job #1466366)

Utilizator om6gaLungu Adrian om6ga Data 29 iulie 2015 00:14:57
Problema Divizori Primi Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>
#include <stdlib.h>
  
#define NMAX 1000000
#define KMAX 7
#define SQRTNMAX 1000
#define PRIME 0
#define CNT   1
  
int T, N, K, i, j, a, b, ind, mid;
int prim[NMAX+5], k_prim[KMAX+1][NMAX+5], cnt[KMAX+1];
  
int cmp(const void * a, const void * b)
{
   return ( *(int*)a - *(int*)b );
}
  
void ciur()
{
    for (i = 2; i <= NMAX; i++)
        if (!prim[i])
        {
            prim[i]++;
            for (j = i<<1; j <= NMAX; j += i)
            {
                prim[j]++;
            }
        }
  
    for (i = 2; i <= NMAX; i++)
            k_prim[prim[i]][++cnt[prim[i]]] = i;
    k_prim[0][++cnt[prim[0]]] = 1;
  
    //for (i = 0; i <= KMAX; i++)
    //    qsort(&k_prim[i][1], cnt[i], sizeof(int), cmp);
}
  
  
int main()
{
    FILE *in, *out;
    in =  fopen("divprim.in", "w");
    out = fopen("divprim.out", "w");
    fscanf(in, "%d\n", &T);
      
    ciur();
  
    while(T)
    {
        fscanf(in, "%d %d\n", &N, &K);
        if (K == 0)
            fprintf(out, "%d\n", 1);
        else
        {
            a = 1;
            b = cnt[K];
            ind = 0;
            while (b - a >= 10)
            {
                mid = (a + b)>>1;
                if (k_prim[K][mid] < N)
                    a = mid + 1;
                else if (k_prim[K][mid] > N)
                    b = mid - 1;
                else
                {
                    ind = mid;
                    break;
                }
            }
            if (!ind)
            {
                for (i = 0; i < 10 && k_prim[K][a+i] < N; i++);
                if (k_prim[K][a+i] == N)
                    ind = i;
                else
                    ind = i > 0 ? a+i : (a>1 ? a-1:0);
            }
 
             
            fprintf(out, "%d\n", k_prim[K][ind]);
        }
        T--;
    }
  
  
    fclose(in);
    fclose(out);
    return 0; 
}