Cod sursa(job #3250578)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 22 octombrie 2024 11:10:48
Problema Pascal Scor 50
Compilator cpp-64 Status done
Runda cex_1 Marime 1.13 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream f("pascal.in");
ofstream g("pascal.out");

const int nmax = 5000005;
int r, d, exp[nmax], divi[5], numi, Min[nmax];
bool ciur[nmax];
vector<int> prim;

void Ciur()
{
    for(int i = 2; i * i <= nmax - 5; i ++)
        if(!ciur[i])
            for(int j = 2 * i; j <= nmax - 5; j += i)
            {
                if(!Min[j]) Min[j] = i;
                ciur[j] = true;
            }

    for(int i = 2; i <= nmax - 5; i ++)
        if(!ciur[i])
            Min[i] = i, prim.push_back(i);
}

void desc(int x, int semn)
{
    while(x > 1)
    {
        int d2 = Min[x];
        int p = lower_bound(prim.begin(), prim.end(), d2) - prim.begin();

        while(x % d2 == 0)
            x /= d2, exp[p] += semn;
    }
}

int main()
{
    Ciur();
    f >> r >> d;

    for(int i = 0; i < 3; i ++)
        while(d % prim[i] == 0)
            d /= prim[i], divi[i] ++;

    for(int i = 1; i < r; i ++)
    {
        desc(r - i + 1, 1);
        desc(i, -1);

        if(exp[0] >= divi[0] && exp[1] >= divi[1] && exp[2] >= divi[2])
            numi ++;
    }

    g << numi;
    return 0;
}