Cod sursa(job #1465806)

Utilizator om6gaLungu Adrian om6ga Data 28 iulie 2015 00:20:05
Problema Pascal Scor 60
Compilator c Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <stdio.h>

#define RMAX 5000005

int R, D;


inline int pwr(int r, int i, int ri, int div)
{
    int count = 0, aux;
    aux = r;
    while(aux)
    {
        count += aux/div;
        aux /= div;
    }
    aux = i;
    while(aux)
    {
        count -= aux/div;
        aux /= div;
    }
    aux = ri;
    while(aux)
    {
        count -= aux/div;
        aux /= div;
    }
    return count;
}

int nr(int r, int d)
{
    int count = 0, i, aux[3];
    
    for (i = 1; i <= r/2; i++)
    {
        if (d == 2)
            count += (pwr(r, i, r-i, 2) > 0 ? 1 : 0);
        else if (d == 3)
            count += (pwr(r, i, r-i, 3) > 0 ? 1 : 0);
        else if (d == 4)
            count += (pwr(r, i, r-i, 2) >= 2 ? 1 : 0);
        else if (d == 5)
            count += (pwr(r, i, r-i, 5) > 0 ? 1 : 0);
        else if (d == 6)
            count += (pwr(r, i, r-i, 2) && pwr(r, i, r-i, 3) ? 1 : 0);
    }
    count *= 2;
    if ((r/2)*2 == r)
    {
        if (d == 2)
            count -= (pwr(r, r/2, r/2, 2) > 0 ? 1 : 0);
        else if (d == 3)
            count -= (pwr(r, r/2, r/2, 3) > 0 ? 1 : 0);
        else if (d == 4)
            count -= (pwr(r, r/2, r/2, 2) >= 2 ? 1 : 0);
        else if (d == 5)
            count -= (pwr(r, r/2, r/2, 5) > 0 ? 1 : 0);
        else if (d == 6)
            count -= (pwr(r, r/2, r/2, 2) && pwr(r, r/2, r/2, 3) ? 1 : 0);
    }  
    
    return count;   
}

int main()
{
    FILE *in, *out;
    in = fopen("pascal.in", "r");
    out = fopen("pascal.out", "w");
    fscanf(in, "%d %d", &R, &D);

    fprintf(out, "%d\n", nr(R, D));
    fclose(in);
    fclose(out);
    return 0;   
}