Cod sursa(job #3306179)

Utilizator Lex._.Lex Guiman Lex._. Data 8 august 2025 12:11:35
Problema Pascal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.26 kb
#include <bits/stdc++.h>
#define MAX 5000000
using namespace std;

int putere_2[MAX+1], putere_3[MAX+1], putere_5[MAX+1]; ///puterile lui 2, 3 si 5 din descompunerea in factori primi ale fiecarui factorial pana la 5 000 000

void precalc() ///precalculam vectorii putere_2, putere_3 si putere_5
{
    int putere=1;
    while(putere<=MAX) ///calculam puterea lui 2 din descompunerea fiecarui numar pana la 5 000 000
    {
        for(int p=putere; p<=MAX; p+=putere)
            putere_2[p]++;
        putere*=2;
    }
    for(int i=1; i<=MAX; i++) ///calculam puterea lui 2 din descompunerea fiecarui factorial (insumand puterile lui 2 din fiecare numar)
        putere_2[i]+=putere_2[i-1];

    ///analog si pentru puterile lui 3 si 5
    putere=1;
    while(putere<=MAX)
    {
        for(int p=putere; p<=MAX; p+=putere)
            putere_3[p]++;
        putere*=3;
    }
    for(int i=1; i<=MAX; i++)
        putere_3[i]+=putere_3[i-1];

    putere=1;
    while(putere<=MAX)
    {
        for(int p=putere; p<=MAX; p+=putere)
            putere_5[p]++;
        putere*=5;
    }
    for(int i=1; i<=MAX; i++)
        putere_5[i]+=putere_5[i-1];
}

bool verif(int i, int j, int d) ///verifica daca i!/((i-j)!*j!) este divizibil cu d
{
    ///fiindca d este maxim 6, vom lua fiecare caz in parte
    if(d==2)
    {
        if(putere_2[i]-putere_2[i-j]-putere_2[j]>=1)
            return 1;
    }
    else if(d==3)
    {
        if(putere_3[i]-putere_3[i-j]-putere_3[j]>=1)
            return 1;
    }
    else if(d==4)
    {
        if(putere_2[i]-putere_2[i-j]-putere_2[j]>=2)
            return 1;
    }
    else if(d==5)
    {
        if(putere_5[i]-putere_5[i-j]-putere_5[j]>=1)
            return 1;
    }
    else if(d==6)
    {
        if(putere_2[i]-putere_2[i-j]-putere_2[j]>=1 && putere_3[i]-putere_3[i-j]-putere_3[j]>=1)
            return 1;
    }
    return 0;
}

int main()
{
    ifstream in("pascal.in");
    ofstream out("pascal.out");
    precalc();

    int r, d;
    in >> r >> d;
    int nr_divizibile=0; ///numarul de numere de pe randul r divizibile cu d

    for(int j=0; j<=r; j++)
    {
        if(verif(r, j, d)==1)
            nr_divizibile++;
    }
    out << nr_divizibile;

    return 0;
}