Cod sursa(job #1159943)

Utilizator mihai995mihai995 mihai995 Data 29 martie 2014 23:19:32
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <fstream>
#include <cstdlib>
using namespace std;

const int N = 1 + 5e6;

int doi[N], trei[N], cinci[N];

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

void computeFactorCnt(int v[], int n, int D){
    for (int i = D ; i <= n ; i++)
        v[i] = i / D + v[i / D];
}

inline int comb(int fact[], int n, int k){
    return fact[n] - fact[k] - fact[n - k];
}

int compute(int n, int a[], int cntA, int b[], int cntB){
    int ans = 0;
    for (int i = 0 ; i < (n >> 1) ; i++)
        if ( cntA <= comb(a, n, i) && cntB <= comb(b, n, i) )
            ans++;
    ans <<= 1;
    if ( (n & 1) == 0 && cntA <= comb(a, n, n >> 1) && cntB <= comb(b, n, n >> 1) )
        ans++;
    return ans;
}

int main(){
    int n, D;

    in >> n >> D;
    if (D % 2 == 0)
        computeFactorCnt(doi, n, 2);
    if (D % 3 == 0)
        computeFactorCnt(trei, n, 3);
    if (D % 5 == 0)
        computeFactorCnt(cinci, n, 5);

    if (D == 2)
        out << compute(n, doi, 1, doi, 1) << '\n';
    else if (D == 3)
        out << compute(n, trei, 1, trei, 1) << '\n';
    else if (D == 4)
        out << compute(n, doi, 2, doi, 2) << '\n';
    else if (D == 5)
        out << compute(n, cinci, 1, cinci, 1) << '\n';
    else
        out << compute(n, doi, 1, trei, 1) << '\n';

    return 0;
}