結果
| 問題 | No.12 限定された素数 |
| コンテスト | |
| ユーザー |
codershifth
|
| 提出日時 | 2015-07-20 00:14:01 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
AC
|
| 実行時間 | 63 ms / 5,000 ms |
| コード長 | 2,892 bytes |
| 記録 | |
| コンパイル時間 | 2,007 ms |
| コンパイル使用メモリ | 164,616 KB |
| 実行使用メモリ | 6,088 KB |
| 最終ジャッジ日時 | 2024-11-24 08:23:16 |
| 合計ジャッジ時間 | 4,032 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
#include <bits/stdc++.h>
typedef long long ll;
typedef unsigned long long ull;
#define FOR(i,a,b) for(int (i)=(a);i<(b);i++)
#define REP(i,n) FOR(i,0,n)
#define RANGE(vec) (vec).begin(),(vec).end()
using namespace std;
std::vector<int> sieve(int n) {
std::vector<bool> is_prime(n+1);
fill(is_prime.begin(), is_prime.end(), true);
is_prime[0] = is_prime[1] = false;
for (int i = 2; i <= n; ++i)
{
if ( is_prime[i] )
{
for (int j = 2*i; j <= n; j += i)
is_prime[j] = false;
}
}
std::vector<int> ans;
for (int i = 0; i < is_prime.size(); ++i)
{
if ( is_prime[i] )
ans.push_back(i);
}
return ans;
}
class LimitedPrimeNumber {
public:
void solve(void) {
int N;
cin>>N;
int bit = 0;
// a[i] は 0...9 までしかないので bit で表現する
// 0 は 1番目の bit で表現する
#define encode(A) (1<<((A)+1))
// どの数字を使うかを bits で表現する
REP(i, N)
{
int a;
cin>>a;
bit |= encode(a);
}
const int upper = 5000000;
const auto primes = sieve(upper);
int n = primes.size();
vector<int> bits(n, 0);
// O(n*log10(maxP)) < n*10
REP(i, n)
{
int p = primes[i];
while (p)
{
bits[i] |= encode(p%10);
p /= 10;
}
}
int start = 0;
int KL = -1;
// O(n)
while (start < n)
{
// 余計なものがあればダメ
if (bits[start] & ~bit)
{
++start;
continue;
}
// start を固定して end をのばせるだけ伸ばす
int end = start;
int bit2 = 0;
while (end < n && !(bits[end] & ~bit))
{
bit2 |= bits[end];
++end;
}
if (start == end)
++end;
else if ((bit2 ^ bit) == 0) // 足りないものがないなら
{
int K = start>0? primes[start-1]+1 : 1;
int L = end<n? primes[end]-1 : upper;
KL = max(KL, L-K);
}
start = end;
}
cout<<KL<<endl;
}
};
#if 1
int main(int argc, char *argv[])
{
ios::sync_with_stdio(false);
auto obj = new LimitedPrimeNumber();
obj->solve();
delete obj;
return 0;
}
#endif
codershifth