CT-1 B 素数个数 题解

题目传送门


这题就是个标准的质数埃氏筛的题。先特判输入为 1,然后可以先假设 $2\sim N$ 全是素数,建个变量 $s$ 初值 $n-1$,从 $4$ 开始把所有偶数标成 $1$,表示这个是合数,$s$ 减一。然后从 $3$ 到 $\sqrt{n}$ 循环 $i$,如果 $i$ 没标 $1$,就把 $i\times k^{k=i}_{n\div i}$ 标出来,每次标就 $s$ 减一。最后直接枚举 $n$ 的质因数再输出就行了。

std:

#include<iostream>
#include<cstdio>
using namespace std;
int n;
bool pri[100000010];//最好开布尔不然容易爆空间
int main()
{
    scanf("%d",&n);
    if(n==1)//特判
    {
        printf("1 is neither a prime nor a composite number");
        return 0;
    }
    int as=n-1;
    pri[1]=1;
    for(int i=4;i<=n;i+=2)//标偶数
        pri[i]=1,as--;
    for(int i=3;i*i<=n;i+=2)//偶数不可能是质数
        if(!pri[i])
            for(int k=i;k*i<=n;k+=2)//奇数乘偶数也是偶数
            {
                if(!pri[k*i])
                    as--;
                pri[k*i]=1;
            }
    if(!pri[n])//特判减O(n/2)的复杂度
    {
        printf("%d %d",as,n);
        return 0;
    }
    for(int i=n/2;i>=2;i--)//枚举质因数
        if(!pri[i]&&!(n%i))
        {
            printf("%d %d",as,i);
            return 0;
        }
    return 0;
}
posted @ 2023-09-07 21:22  电乔  阅读(35)  评论(0)    收藏  举报  来源