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;
}

浙公网安备 33010602011771号