神奇现象求解答

P3383 【模板】线性筛素数

not_so_littlekayen @ 2024-08-05 22:55:00

#include <bits/stdc++.h>
using namespace std;
#define Max 1000005
int p[Max], n, q, cnt;
bool prime[100*Max];
void xxs()
{
    for(int i = 2;i <= n;i++)prime[i] = 1;
    for(int i = 2;i <= n;i++)
    {
        if(prime[i])
            p[++cnt] = i;
        for(int j = 1;j <= cnt&&i*p[j] <= n;j++)
        {
            prime[i*p[j]] = 0;
            if(i%p[j] == 0)break;
        }
    }

}
int main()
{
    cin >> n >> q;
    xxs();
    while(q--)
    {
        int x;
        scanf("%d", &x);
        printf("%d\n", p[x]);
    }
    return 0;
}

以及

#include <bits/stdc++.h>
using namespace std;
#define Max 1000005
bool prime[100*Max];
int p[Max], n, q, cnt;
void xxs()
{
    for(int i = 2;i <= n;i++)prime[i] = 1;
    for(int i = 2;i <= n;i++)
    {
        if(prime[i])
            p[++cnt] = i;
        for(int j = 1;j <= cnt&&i*p[j] <= n;j++)
        {
            prime[i*p[j]] = 0;
            if(i%p[j] == 0)break;
        }
    }

}
int main()
{
    cin >> n >> q;
    xxs();
    while(q--)
    {
        int x;
        scanf("%d", &x);
        printf("%d\n", p[x]);
    }
    return 0;
}

上面的是RE,下面的是AC,仅仅因为调换了

bool prime[100*Max];

int p[Max], n, q, cnt;

的位置

所以为什么会出现这样子的情况,求解答


by tzl_Dedicatus545 @ 2024-08-05 22:56:03

@not_so_littlekayen 因为你数组越界了。。。


by not_so_littlekayen @ 2024-08-05 22:56:42

@tzl_Dedicatus545 where?


by tzl_Dedicatus545 @ 2024-08-05 22:56:59

@not_so_littlekayen 10^8 以下的质数约有 \dfrac{10^8}{\ln10^8} 个,这不越界才有鬼了。。。。


by tzl_Dedicatus545 @ 2024-08-05 22:57:26

@not_so_littlekayen int p[Max] 这里。


by not_so_littlekayen @ 2024-08-05 22:58:15

@tzl_Dedicatus545 知道了,谢谢


|