Submission #1131603

#TimeUsernameProblemLanguageResultExecution timeMemory
1131603sunflowerSpiderman (COCI20_spiderman)C++17
70 / 70
48 ms14152 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define MASK(x) (1LL << (x))
#define BIT(x, i) (((x) >> (i)) & 1)
#define SZ(x) ((int) (x).size())
#define ALL(a) (a).begin(), (a).end()
#define FOR(i, a, b) for (int i = (a); i <= (b); ++i)
#define FORD(i, a, b) for (int i = (a); i >= (b); --i)

#define left    __left
#define right   __right
#define prev    __prev
#define fi      first
#define se      second

template <class X, class Y>
    bool maximize(X &x, Y y) {
        if (x < y) return x = y, true;
        else return false;
    }

template <class X, class Y>
    bool minimize(X &x, Y y) {
        if (x > y) return x = y, true;
        else return false;
    }

int numHouse, remMod;

#define MAX_N 300'005
int high[MAX_N + 2];

#define LIM 1'000'007
int cnt[2 * LIM + 2], dp[2 * LIM + 2];

namespace subtask1 {
    bool check() {
        return (numHouse <= 2000);
    }

    void solve() {
        FOR(i, 1, numHouse) {
            int ans = 0;
            FOR(j, 1, numHouse) {
                if (i == j) continue;
                if (high[i] % high[j] == remMod) ++ans;
            }

            cout << ans << " ";
        }
    }
}

namespace subtask3 {
    bool check() {
        return (remMod == 0);
    }

    void solve() {
        memset(cnt, 0, sizeof(cnt));
        FOR(i, 1, numHouse) cnt[high[i]]++;

        FOR(i, 1, trunc(sqrt(LIM))) {
            dp[i * i] += cnt[i];
            FOR(j, i + 1, LIM / i) {
                dp[i * j] += cnt[i];
                dp[i * j] += cnt[j];
            }
        }

        FOR(i, 1, numHouse) cout << dp[high[i]] - 1 << " "; // tru chinh no;
    }
}

namespace subtask4 {
    void solve() {
        memset(cnt, 0, sizeof(cnt));
        FOR(i, 1, numHouse) cnt[high[i]]++;

        FOR(i, 1, trunc(sqrt(LIM))) {
            if (i > remMod) dp[i * i] += cnt[i];
            FOR(j, i + 1, LIM / i) {
                if (i > remMod) dp[i * j] += cnt[i];
                if (j > remMod) dp[i * j] += cnt[j];
            }
        }

        FORD(i, LIM - 1, 1) cnt[i] += cnt[i + 1];

        // a / b = q du r ==> a = b * q + r (b > r);

        FOR(i, 1, numHouse) {
            if (remMod > high[i]) cout << "0 ";
            else if (remMod == high[i]) {
                cout << cnt[high[i] + 1] << " ";
            } else { // high[j] * MUL + remMod = high[i];
                cout << dp[high[i] - remMod] - (remMod == 0) << " ";
            }
        }
    }
}

int main() {
    ios_base::sync_with_stdio(false);cin.tie(nullptr);
    // freopen("spiderman.inp","r",stdin);
    // freopen("spiderman.out","w",stdout);
    cin >> numHouse >> remMod;
    FOR(i, 1, numHouse) cin >> high[i];

//    if (subtask1 :: check()) return subtask1 :: solve(), 0;
    subtask4 :: solve();

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...