这是我T1的考场代码,数组开大了很多,luogu上测试还有70分,后三个点mle,ll改int能A,为什么没有全部mle,以及ccf测评的时候会不会爆0,求大佬指教
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll t,x[200001];
ll mx,cnt;
ll prime[2000001];
ll sv[20000001],svcnt;
ll isp[20000001],isv[20000001];
ll lst[20000001];
ll ans[20000001],acnt,lt;
bool check(ll i)
{
while(i)
{
if(i % 10 == 7)
{
return true;
}
i /= 10;
}
return false;
}
void cx()
{
for (ll i = 2; i <= 2 * mx; i++)
{
if( isv[i] == 1 || check(i) )
{
//cout << i<< " ";
sv[++svcnt] = i;
isv[i] = 1;
for (int j = 1; j <= cnt && prime[j] * i <= mx * 2; j++)
{
isv[ i * prime[j] ] = 1;
if( i % prime[j] == 0 )
{
//break;
}
}
}
else
{
//if(lt == 6) cout << i << "uuu";
lst[ lt ] = i;
lt = i;
}
}
}
void ou()
{
for (ll i = 2; i <= 2 * mx; i++)
{
if( isp[i] == 0 )
{
prime[++cnt] = i;
}
for (int j = 1; j <= cnt && prime[j] * i <= 2 * mx; j++)
{
isp[ i * prime[j] ] = 1;
if( i % prime[j] == 0 )
{
break;
}
}
}
}
int main()
{
freopen("number.in","r",stdin);
freopen("number.out","w",stdout);
int a;
scanf(" %lld",&t);
for (int i = 1; i <= t; i++)
{
scanf(" %lld",&x[i]);
mx = max(mx,x[i]);
}
ou();
cx();
lst[1] = 2;
for (int i = 1; i <= t; i++)//?
{
if(isv[x[i]])printf("-1\n");
else printf("%lld\n",lst[ x[i] ]);
}
fclose(stdin);
fclose(stdout);
return 0;
}