Cod sursa(job #2794495)

Utilizator db_123Balaban David db_123 Data 4 noiembrie 2021 23:39:32
Problema Divizori Primi Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.25 kb
#include <fstream>

const int DIM=1000000;

using namespace std;

ifstream cin("divprim.in");
ofstream cout ("divprim.out");

int  ma[8][DIM];
int  nrDiv[DIM+1];
bool ciur[DIM+1];
int  cnt[8];

int  main()
{

    int n,t,k;

    nrDiv[1]=1;
    for(int i=2; i<=DIM; i++)
    {
        k=1;
        if(nrDiv[i]==0)
        {
            for(int d=i; d<=DIM; d=d+i)
            {
                nrDiv[d]++;
            }
        }
        /// set in matrix the value for i-1
        if(nrDiv[i-1]<=7)
        {
            ma[nrDiv[i-1]][0]++;
            ma[nrDiv[i-1]][ma[nrDiv[i-1]][0]]= i-1;
            cnt[nrDiv[i-1]]=ma[nrDiv[i-1]][0];
        }


    }

    /*
    nrDiv[2]=1;
    i=4;
    while(i<=DIM)
    {
        nrDiv[i]++;
        ciur[i]=1;
        i+=2;
    }
    for(i=3;i<DIM;i+=2)
    {
        if(ciur[i]==0) /// nr prim
        {
            nrDiv[i]++;
            j=2*i;
            while(j<=DIM)
            {
                nrDiv[j]++;
                ciur[j]=1;
                j+=i;
            }
        }
    }
    */

//    for(int i=1;i<=7;i++)
//    {
//        k=1;
//        for(int j=2;j<=DIM;j++)
//        {
//            if(nrDiv[j]==i)
//                ma[i][k++]=j; /// increment nr of divisors
//        }
//        cnt[i]=k-1;
//    }

/*
    for ( int i =  1 ; i <=7 ; i++)
    {
        for(int j = 0; j <= 100 ; j++)
            cout << ma[i][j] << " ";
        cout << endl;
    }
    cout << " pos :" << endl;
    for ( int i =  1 ; i <=7 ; i++)
    {
        cout << cnt[i] << " ";
    }
    */
    int nr,d;
    int left,right,mid,sol;
    cin >> t;
    for(int i=1;i<=t;i++)
    {
        cin >> nr >> d;
        left = 1;
        sol=0;
        right = cnt[d];
        while(left<= right)
        {
            mid = (left + right)/2;
            if(ma[d][mid] < nr )
            {
                sol = ma[d][mid];
                left = mid + 1;
            }
            else if (ma[d][mid] > nr )
            {
                right= mid -1;
            }
            else
            {
                sol =  ma[d][mid];
                break;
            }
        }
        cout << sol<< endl;
    }

    return 0;
}