Cod sursa(job #1464574)

Utilizator GeiGeiGeorge Cioroiu GeiGei Data 23 iulie 2015 21:56:45
Problema Pascal Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <cstdio>
#include <iostream>
#include <vector>
#include <set>
#include <cmath>
#include <climits>
#include <list>
#include <iomanip>
#include <cstdlib>
#include <fstream>
#include <map>
#include <algorithm>
#define nmax 500005

using namespace std;

void com(int* f, int* p, int r, int d) {
    for (int i = 0; i <= r; i++) {
        p[i] = 0;
    }
    for (int i = d; i <= r; i += d) {
        p[i] = p[i / d] + 1;
    }
    f[0] = 0;
    for (int i = 1; i <= r; i++) {
        f[i] = f[i - 1] + p[i];
    }
}

long long evol(int* f, int r, int m) {
    long long ans = 0;
    for (int i = 0; 2 * i < r; i++) {
        if (f[r] - f[i] - f[r - i] > m) {
            ans += 2;
        }
    }
    if (r % 2 == 0 && f[r] - 2 * f[r / 2] > m) {
        ans++;
    }
    return ans;
}

long long fct(int r, int d) {
    if (r == 0) {
        return 0;
    }
    long long ans = 0;
    int* f = new int[r + 1];
    int* p = new int[r + 1];
    if (d == 2) {
        com(f, p, r, 2);
        ans = evol(f, r, 0);
    } else if (d == 4) {
        com(f, p, r, 2);
        ans = evol(f, r, 1);
    } else if (d == 3) {
        com(f, p, r, 3);
        ans = evol(f, r, 0);
    } else if (d == 5) {
        com(f, p, r, 5);
        ans = evol(f, r, 0);
    } else {
        com(f, p, r, 2);
        int* f3 = new int[r + 1];
        int* p3 = new int[r + 1];
        com(f3, p3, r, 3);
        for (int i = 0; 2 * i < r; i++) {
            if (f[r] - f[i] - f[r - i] > 0 && f3[r] - f3[i] - f3[r - i]) {
                ans += 2;
            }
        }
        if (r == 2 && f[r] - 2 * f[r / 2] > 0 && f3[r] - 2 * f3[r / 2]) {
            ans++;
        }
    }
    return ans;
}

int main() {
    freopen("pascal.in", "r", stdin);
    freopen("pascal.out", "w", stdout);

    ios_base::sync_with_stdio(false);
    cin.tie(0);

    int r, d;
    cin >> r >> d;
    long long ans = fct(r, d);
    cout << ans;

    return 0;
}