yukicoder No.6 使いものにならないハッシュ
No.6 使いものにならないハッシュ - yukicoder
問題概要
で素数の連続部分列のうち、桁和ハッシュ(
桁になるまで行う)が衝突しない最大のものを求めよ。
解法
しゃくとり実装面倒だったのでズルをした。素数の個数が対数オーダー、かつハッシュがたかだか 種類だったので全探索で余裕で通る。
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;
}