結果
| 問題 | No.12 限定された素数 | 
| コンテスト | |
| ユーザー |  srjywrdnprkt | 
| 提出日時 | 2022-12-19 13:05:41 | 
| 言語 | C++17(clang) (17.0.6 + boost 1.87.0) | 
| 結果 | 
                                AC
                                 
                             | 
| 実行時間 | 276 ms / 5,000 ms | 
| コード長 | 1,633 bytes | 
| コンパイル時間 | 1,380 ms | 
| コンパイル使用メモリ | 149,220 KB | 
| 実行使用メモリ | 6,068 KB | 
| 最終ジャッジ日時 | 2024-11-18 00:55:45 | 
| 合計ジャッジ時間 | 8,870 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| other | AC * 26 | 
ソースコード
#include <iostream>
#include <vector>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <queue>
#include <algorithm>
#include <numeric>
using namespace std;
vector<bool> prime;
vector<int> p;
//O(NloglogN)
void erat(long long N){
    prime.resize(N+1, 1);
    prime[0] = 0;
    prime[1] = 0;
    for (long long i=2; i*i<=N; i++){
        if (prime[i]){
            for (long long j=i*2; j <= N; j+=i){
                prime[j] = 0;
            }
        }
    }
}
map<int, int> mp;
set<int> st;
void update(int X, int p){
    set<int> st2;
    while(X != 0){
        st2.insert(X%10);
        X /= 10;
    }
    for (auto x : st2){
        if (p == 1) mp[x]++;
        else mp[x]--;
    }
}
bool check1(){
    for (int i=0; i<=9; i++){
        if (!st.count(i) && mp[i] > 0) return 0;
    }
    return 1;
}
bool check2(){
    for (int i=0; i<=9; i++){
        if (!st.count(i) && mp[i] > 0 || (st.count(i) && mp[i] == 0)) return 0;
    }   
    return 1;
}
int main(){
    int N, M, A, l=0, a, b, ans=-1;
    cin >> N;
    erat(5000000);
    for (int i=1; i<=5000000; i++){
        if (prime[i]) p.push_back(i);
    }
    for (int i=0; i<N; i++){
        cin >> A;
        st.insert(A);
    }
    M = p.size();
    for (int r=0; r<M; r++){
        update(p[r], 1);
        while(l<r && !check1()){
            update(p[l], 0);
            l++;
        }
        if (check2()){
            if (l==0) a = 1;
            else a = p[l-1]+1;
            if (r==M-1) b = 5000000;
            else b = p[r+1]-1;
            ans = max(ans, b-a);
        }
    }
    cout << ans << endl;
    return 0;
}
            
            
            
        