結果
| 問題 |
No.12 限定された素数
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2023-02-19 22:15:03 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 176 ms / 5,000 ms |
| コード長 | 1,991 bytes |
| コンパイル時間 | 986 ms |
| コンパイル使用メモリ | 79,540 KB |
| 最終ジャッジ日時 | 2025-02-10 19:07:05 |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
#include<iostream>
#include<vector>
std::vector<int> primes(int n) {
std::vector<bool> is_prime(n + 1, true);
is_prime.at(0) = false;
is_prime.at(1) = false;
std::vector<int> res;
for (int i = 2; i < n + 1; i++) {
if (is_prime.at(i)) {
res.push_back(i);
for (int j = i * 2; j < n + 1; j += i) {
is_prime.at(j) = false;
}
}
}
return res;
}
std::vector<int> digits(int x) {
std::vector<int> res(10, 0);
while (x > 0) {
res.at(x % 10)++;
x /= 10;
}
return res;
}
bool is_excess(std::vector<bool> A, std::vector<int> V) {
for (int i = 0; i < 10; i++) {
if ((!A.at(i)) && V.at(i) != 0) {
return true;
}
}
return false;
}
bool is_shortage(std::vector<bool> A, std::vector<int> V) {
for (int i = 0; i < 10; i++) {
if (A.at(i) && V.at(i) == 0) {
return true;
}
}
return false;
}
int main() {
int N;
std::cin >> N;
std::vector<bool> A(10, false);
for (int i = 0; i < N; i++) {
int a;
std::cin >> a;
A.at(a) = true;
}
const int MAX = 5000000;
const auto P = primes(MAX);
std::vector<int> V(10, 0);
int k_idx = 0;
int ans = 0;
for (int l_idx = 0; l_idx < P.size(); l_idx++) {
const auto l_dig = digits(P.at(l_idx));
for (int i = 0; i < 10; i++) {
V.at(i) += l_dig.at(i);
}
while (is_excess(A, V)) {
const auto k_dig = digits(P.at(k_idx));
for (int i = 0; i < 10; i++) {
V.at(i) -= k_dig.at(i);
}
k_idx++;
}
if (!is_shortage(A, V)) {
int l = l_idx + 1 < P.size() ? P.at(l_idx + 1) - 1 : MAX;
int k = k_idx - 1 >= 0 ? P.at(k_idx - 1) + 1 : 1;
if (ans < l - k) { ans = l - k; }
}
}
if (ans == 0) { ans = -1; }
std::cout << ans << std::endl;
}