洛谷 U85173 T老师的任务

洛谷 U85173 T老师的任务

洛谷传送门

题目背景
高一 · 66班的班主任TT老师是数学竞赛的教练......

题目描述
作为高一 · 6班的信竞选手,同时也是一个对数学拥有浓厚热爱(虽然数学考试一直爆锅)的同学,SeawaySeaway这段时间特别注重数学方面的训练。终于有一天,他的努力换来了TT老师的一个任务:

“我需要一张1-N1−N的质数表,你帮我准备一份。”

SeawaySeaway傻眼了——这得算到什么时候啊!绝望的SeawaySeaway接下了任务,找到你来帮忙......

输入格式
输入文件只有一个整数NN。

输出格式
输出文件包含一行,若干个整数,表示从1-N1−N的质数表。

输入输出样例
输入 #1 复制
10
输出 #1 复制
2 3 5 7
说明/提示
数据范围:

1\le N\le 10^81≤N≤10
8

题解:

我认为,这是一道超纲的题目。因为基础题只学习了质数的判断方式,并没有讲质数的筛选方式。注意体会这两个名词的区别。所以如果是萌新基础,会TLE掉6个点(即用试除法做筛选)。但是这道题的确是一道普及-的题,因为这道题考的是裸的质数筛选,并没有加任何的加工,而质数的筛选其实就是试除法的一种优化模拟。所以如果拿这道题来进行质数筛选的训练的话,会极其锻炼数学建模的思维。这也是我出这道题的理由。

质数的筛选是一个门类,在讲解里是万不可能介绍的。但在这里给出我博客中讲解各种质数筛法的链接。请大家自行学习之后试着AC掉这道题。

质数的筛选讲解

代码:

#include<cstdio>
using namespace std;
const int maxn=1e7+1;
int n,cnt;
int prime[maxn],small[maxn];
void euler(int n)
{
    cnt=0;
    for(int i=2;i<=n;i++)
    {
        if(small[i]==0)
            small[i]=prime[++cnt]=i;
        for(int j=1;j<=cnt;j++)
        {
            if(prime[j]>small[i] || prime[j]>n/i)
                break;
            small[i*prime[j]]=prime[j];
        }
    }
}
int main()
{
    scanf("%d",&n);
    euler(n);
    for(int i=1;i<=cnt;i++)
        printf("%d ",prime[i]);
    return 0;
}
posted @ 2019-08-29 17:09  Seaway-Fu  阅读(77)  评论(0编辑  收藏  举报