关于T1的空间
  • 板块学术版
  • 楼主爆裂魔法
  • 当前回复8
  • 已保存回复8
  • 发布时间2021/11/20 17:23
  • 上次更新2023/11/3 23:59:03
查看原帖
关于T1的空间
330788
爆裂魔法楼主2021/11/20 17:23

这是我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;
}
2021/11/20 17:23
加载中...