いろいろがんばりたいブログ

情報科学科の人がいろいろ書きます。

AOJ 0202 At Boss's Expense

AIZU ONLINE JUDGE
Memory Limit : 32768 KBで、整数の集合をsetしてたらメモリ足りなかった。
bitset使ったら大丈夫。
一応、bootの配列もbitsetに置き換えてみたけど、あんまり変わらなかった気がする。(1000KBくらい?)
最終的には、1500KBくらいで通った。
メモリの量は通した人のをみてると、かなりいい感じなほうかも。
ただ、計算に2,3秒かかってる。
一位の人とかどんな実装なんだろな……

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#include <cmath>
#include <bitset>

using namespace std;
const int MAX = 1000010;
bitset<MAX> isPrime;

void sieve(){
    bitset<MAX> find;
    int i;
    for(i=2;i*i < MAX;i++){
        if(find[i]) continue;
        isPrime.set(i);
        for(int j=i;j<MAX;j++){
            if(j%i == 0){
                find.set(j);
            }
        }
    }
    for(;i<MAX;i++){
        if(!find[i]) {
            isPrime.set(i);
        }
    }
}

int main(){
    sieve();

    while(true){
        int n,x;
        cin >> n >> x;
        if(n==0 && x==0) return 0;
        vector<int> R(n);
        for(int i=0;i<n;i++){
            cin >> R[i];
        }

        bitset<MAX> S;
        S.set(0);
        for(int i=0;i<R.size();i++){
            for(int j=0;j<=x;j++){
                if(!S[j]) continue;
                int newe = j + R[i];
                if(newe > x) continue;
                S.set(newe);
            }
        }
        int maxn = -1;
        for(int i=0;i<=x;i++){
            if(isPrime[i] && S[i]) maxn = i;
        }
        if(maxn == -1) cout << "NA" << endl;
        else cout << maxn << endl;
    }
    return 0;
}