Cod sursa(job #2455741)

Utilizator CyborgSquirrelJardan Andrei CyborgSquirrel Data 12 septembrie 2019 17:16:27
Problema Pascal Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

ifstream fin("pascal.in");
ofstream fout("pascal.out");

int n;

struct boi{
    int n, p, top;
};

int susta(int a, int d)
{
    int p = d, r = 0;
    while(p <= a){
        r += a/p;
        p *= d;
    }
    return r;
}

vector<boi> bois;
void release_bois(int d)
{
    for(int i = 2; d > 1; i++){
        boi b;
        b.n = i;
        b.p = 0;
        while(d % i == 0){
            b.p++;
            d /= i;
        }
        if(b.p != 0){
            b.top = susta(n, b.n);
            bois.push_back(b);
        }
    }
}

int fact(int n, int st = 2)
{
    int r = 1;
    for(int i = st; i <= n; i++){
        r *= i;
    }
    return r;
}

int comb(int n, int k)
{
    return fact(n, k+1) / fact(n-k);
}

bool big_brain(int i, int bi)
{
    boi b = bois[bi];
    int d = b.n;
    int idk = b.top - (susta(i, d) + susta(n-i, d));
    return idk >= b.p;
}

int main()
{
    int d;
    fin >> n >> d;
    release_bois(d);

    int sol = 0;
    for(int i = 1; i <= n/2; i++){
        bool good = true;
        for(int j = 0; j < bois.size(); j++){
            good &= big_brain(i, j);
        }
        if(good){
            if(i == n/2){
                sol += 1;
            }else{
                sol += 2;
            }
        }
    }
    fout << sol;

    int solb = 0;
    for(int i = 0; i <= 10; i++){
        solb += comb(10, i) % 6 == 0;
    }
    return 0;
}