nyoj--24 素数距离问题

nyoj 24

题解

素数打表, O(nlogn) ,然后二分查找。

#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;

const int maxn = 1000005;
vector<int> p;
bool vis[maxn];

void table()
{
    for(int i = 2; i < maxn; ++i)
    {
       if(vis[i]) continue;
        p.push_back(i);
        for(int j = i * 2; j < maxn; j += i) vis[j] = true;
    }
}

int main()
{
    int t, n;

    table();
    for(cin >> t; t--; )
    {
        cin >> n;
        int first = lower_bound(p.begin(), p.end(), n) - p.begin();
        int last  = upper_bound(p.begin(), p.end(), n) - p.begin();
        if(last - first == 1) printf("%d %d\n", p[first], 0);
        else{
            int ans = p[first - 1], pos = first - 1;
            if(abs(n - p[first - 1]) > abs(n - p[first])){
                ans = p[first], pos = first;
            }
            printf("%d %d\n", ans, abs(n - p[pos]));
        }
    }
    return 0;
}

你可能感兴趣的:(nyoj,math,easy+)