結果
| 問題 |
No.6 使いものにならないハッシュ
|
| コンテスト | |
| ユーザー |
mayoko_
|
| 提出日時 | 2014-12-11 10:29:08 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 7 ms / 5,000 ms |
| コード長 | 2,175 bytes |
| コンパイル時間 | 803 ms |
| コンパイル使用メモリ | 76,872 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-09-16 16:22:54 |
| 合計ジャッジ時間 | 1,777 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 32 |
ソースコード
#include <sstream>
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <iostream>
#include <utility>
#include <set>
#include <cctype>
#include <queue>
#include <stack>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define INF 1000000000
using namespace std;
typedef long long ll;
const int MAXN = 400200;
bool isPrime[MAXN];
vector<int> prime;
bool flag[10];
int getHash(int n) {
if (n < 10) return n;
string s = to_string(n);
int ret = 0;
for (int i = 0; i < s.size(); i++) {
ret += s[i] - '0';
}
return getHash(ret);
}
void createPrime() {
for (int i = 2; i < MAXN; i++) isPrime[i] = true;
for (int i = 2; i * i < MAXN; i++) {
if (isPrime[i]) {
for (int j = 2; i * j < MAXN; j++) {
isPrime[i*j] = false;
}
}
}
for (int i = 2; i < MAXN; i++) {
if (isPrime[i]) prime.push_back(i);
}
}
int main(void) {
createPrime();
int K, N;
cin >> K;
cin >> N;
int startIndex = 0;
int endIndex = 0;
for (int i = 0; ; i++) {
if (prime[i] >= K) {
startIndex = i;
break;
}
}
for (int i = startIndex; ; i++) {
if (prime[i] > N) {
endIndex = i;
break;
}
}
// cout << startIndex << " " << endIndex << endl;
// しゃくとり法
int ansIndex = -1;
int maxLength = 0;
int s = startIndex, t = startIndex;
while (1) {
// collisionするまで長さを増やす
// cout << "start " << s << endl;
while (t < endIndex) {
int tmp = getHash(prime[t]);
if (flag[tmp]) break;
else {
flag[tmp] = true;
t++;
}
}
// cout << "end " << t << endl;
if (maxLength <= t - s) {
ansIndex = s;
maxLength = t-s;
}
flag[getHash(prime[s])] = false;
s++;
if (t >= endIndex) break;
}
cout << prime[ansIndex] << endl;
return 0;
}
mayoko_