Shuz*'s Blog

事象の性質を考察する

yukicoder No.6 使いものにならないハッシュ

No.6 使いものにならないハッシュ - yukicoder

問題概要

[K,\ N]素数の連続部分列のうち、桁和ハッシュ( 1 桁になるまで行う)が衝突しない最大のものを求めよ。

解法

しゃくとり実装面倒だったのでズルをした。素数の個数が対数オーダー、かつハッシュがたかだか 10 種類だったので全探索で余裕で通る。

vector<ll> prime(ll n) {
    vector<ll> Prime(n + 1);
    rep(i, n + 1) Prime[i] = 1;
    Prime[0] = Prime[1] = 0;
    rep(i, n + 1) {
        if (Prime[i]) {
            rep(j, n / i - 1) Prime[i * (j + 2)] = 0;
        }
    }
    return Prime;
}

ll Hash(ll n) {
    if (n < 10) return n;
    ll S = 0;
    while (n) S += n % 10, n /= 10;
    return Hash(S);
}

int main() {
    ll N, K;
    cin >> K >> N;
    vector<ll> P = prime(N), Q;
    inc(i, K, N) if (P[i]) Q.pb(i);
    ll res, max = 0;
    rep(i, Q.size()) {
        map<ll, ll> M;
        rep(j, Q.size() - i) {
            if (M[Hash(Q[i + j])]++) {
                if (max <= j) {
                    max = j;
                    res = Q[i];
                }
                goto end;
            }
        }
        if (max <= Q.size() - i) {
            max = Q.size() - i;
            res = Q[i];
        }
    end:;
    }
    cout << res << endl;
}