多校越来越难了……
A
发现只有可能连着1~2个正数的和是质数,然后很容易发现没有-1的情况,因为无论如何答案是[-t,t+1]或者[-t,t+2]或者[x,x]或者[x-1,x]或者[x,x+1],除了0的情况很特殊直接输出3。然后就是暴力判断即可

#include<bits/stdc++.h> using namespace std; const int N=2e7+70; int n,cnt,pri[N/10],n1[N/2],n2[N/2]; bool vis[N],is[N]; int main() { int T;scanf("%d",&T); n=2e7+7; vis[1]=1; for(int i=2;i<=n;++i) { if(!vis[i])pri[++cnt]=i; for(int j=1;j<=cnt&&i*pri[j]<=n;++j) { vis[i*pri[j]]=1; if(i%pri[j]==0)break; } } for(int i=1e7+1;i;--i)if(!vis[i*2+1])n2[i]=i;else n2[i]=n2[i+1]; for(int i=1e7+19;i;--i)if(!vis[i])n1[i]=i;else n1[i]=n1[i+1]; while(T--) { scanf("%d",&n); int ans1,ans2; if(!n)puts("3"); else if(n<0)printf("%d ",min(2*n1[1-n],2*n2[1-n]+1)); else if(n==n1[n])puts("1"); else if(n-1==n2[n-1]||n==n2[n])puts("2"); else printf("%d ",min(2*n1[n],2*n2[n]+1)); } }
持续更新中……