题解
素数打表, O(nlogn) ,然后二分查找。
#include <iostream>
#include <cstring>
#include <vector>
#include <cmath>
#include <cstdio>
#include <algorithm>
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;
}