Cod sursa(job #1416991)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 9 aprilie 2015 12:31:52
Problema Pascal Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>

using namespace std;

#define inFile "pascal.in"
#define outFile "pascal.out"
#define MAX_R 5000001

FILE *in = fopen(inFile, "r");
FILE *out = fopen(outFile, "w");

int exp2[MAX_R];
int exp3[MAX_R];
int exp5[MAX_R];

inline bool isDiv(int R, int k, int D) {
    if(D == 2) return exp2[R] - exp2[k] - exp2[R-k] > 0;
    else if(D == 3) return exp3[R] - exp3[k] - exp3[R-k] > 0;
    else if(D == 4) return exp2[R] - exp2[k] - exp2[R-k] > 1;
    else if(D == 5) return exp5[R] - exp5[k] - exp5[R-k] > 0;
    else return (exp2[R] - exp2[k] - exp2[R-k] > 0) && (exp3[R] - exp3[k] - exp3[R-k] > 0);
}

int main() {
    int R, D, i, j, nDiv = 0;
    
    fscanf(in, "%d %d", &R, &D);
    
    exp2[0] = exp3[0] = exp5[0] = 0;
    for(i = 1; i <= R; i++) {
        exp2[i] = exp2[i-1];
        for(j = i; j % 2 == 0; j /= 2) exp2[i]++;
        
        exp3[i] = exp3[i-1];
        for(j = i; j % 3 == 0; j /= 3) exp3[i]++;
        
        exp5[i] = exp5[i-1];
        for(j = i; j % 5 == 0; j /= 5) exp5[i]++;
    }
    
    R--;
    if(R & 1) {
        for(i = 1; i <= R/2; i++)
            if(isDiv(R+1, i, D)) nDiv++;
        nDiv *= 2;
        if(isDiv(R+1, (R+1)/2, D)) nDiv++;
    }
    else {
        for(i = 1; i <= R/2; i++)
            if(isDiv(R+1, i, D)) nDiv++;
        nDiv *= 2;
    }
    
    fprintf(out, "%d\n", nDiv);
    
    fclose(in);
    fclose(out);
    
    return 0;
}