Cod sursa(job #3225969)

Utilizator BuzdiBuzdugan Rares Andrei Buzdi Data 19 aprilie 2024 14:56:58
Problema Pascal Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <fstream>
#include <stack>
#include <vector>
#include <algorithm>
#include <queue>
#include <map>
#define ll long long

using namespace std;

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

int n, D, answer;
vector<pair<int, int>> desc;
vector<ll> expF;

ll Legendre(int p, int n)
{
    ll curent_p = p, cnt_p = 0;
    while(curent_p <= n)
    {
        cnt_p += n / curent_p;
        curent_p *= p;
    }
    return cnt_p;
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n >> D;

    int d = 2;
    while(D > 1)
    {
        int p = 0;
        while(D % d == 0)
        {
            p++;
            D /= d;
        }

        if(p)
            desc.emplace_back(d, p);

        d++;
        if(d * d > D)
            d = D;
    }

    expF.resize(desc.size());
    for(int i = 0; i < (int) desc.size(); i++)
        expF[i] = Legendre(desc[i].first, n);

    for(int i = 0; i <= n; i++)
    {
        int good = 1;
        for(int j = 0; j < (int) desc.size() && good == 1; j++)
        {
            ll curent_exp1 = Legendre(desc[j].first, i);
            ll curent_exp2 = Legendre(desc[j].first, n - i);

            ll exactly_exp = expF[j] - curent_exp1 - curent_exp2;

            cout << exactly_exp << '\n';

            if(exactly_exp < desc[j].second)
                good = 0;
        }

        answer += good;
    }

    cout << answer;


    return 0;
}