Pagini recente » Cod sursa (job #3285017) | Cod sursa (job #2473007) | Cod sursa (job #1122902) | Cod sursa (job #2562408) | Cod sursa (job #1416991)
#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;
}