Cod sursa(job #1803684)

Utilizator andreinichitaTirziu Nichita andreinichita Data 11 noiembrie 2016 18:04:51
Problema Divizori Primi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.71 kb
#include <cstdio>

using namespace std;
/*const int NMAX=300;
bool ciur[NMAX];
void ciurul()
{
    int I, J;
    for(I=2; I<=NMAX; I++)
        ciur[I] =1;
    for (I=2; I<=NMAX; I++)
        if(ciur[I] == 1)
            for(J=2; J*I <= NMAX; J ++)
                ciur[I*J] = 0;
}
int nrdivprim(int n,int k)
{
    ciurul();
    int d,nr=0;
    for(d=2; d<=n; d++)
        if(ciur[d]==1&&n%d==0)
            nr++;
    if(nr==k)
        return 1;
    return 0;
}
int numbers[NMAX][7];
void completare()
{
    int i,j,k;
    for(i=2; i<=NMAX; i++)
        for(j=0; j<=7; j++)
        {
            for(k=i; k>=2; k--)
                if(nrdivprim(k,j))
                {
                    numbers[i][j]=k;
                    break;const int NMAX=6000;
                }
        }
}
int main()
{
    freopen("divprim.in","r",stdin);
    freopen("divprim.out","w",stdout);
    int t,n,k,i,j,ok;
    scanf("%d",&t);
    completare();
    for(i=1; i<=t; i++)
    {
        ok=0;
        scanf("%d%d",&n,&k);
        printf("%d\n",numbers[n][k]);
    }
    return 0;
}*/
int x[1000001],nr[8][1000001];
int main()
{
    freopen("divprim.in","r",stdin);
    freopen("divprim.out","w",stdout);
    int t,n,k,i,j;
    scanf("%d",&t);
    for(i=2; i<=1000000; i++)
    {
        if(x[i]==0)
        {
            for(j=2*i; j<=1000000; j=j+i)
               x[j]++;
            x[i]=1;
        }
    }
    for(i=1;i<=7;i++)
        for(j=1;j<=1000000;j++)
    {
        if(x[j]==i)
            nr[i][j]=j;
        else
            nr[i][j]=nr[i][j-1];
    }
    for(i=1;i<=t;i++)
    {
        scanf("%d%d",&n,&k);
        printf("%d\n",nr[k][n]);
    }
    return 0;
}