海淀区区赛2018第三题:有限域

试题描述

在抽象代数中,有一个关于有限域的定理:存在一个大小为q的有限域当且仅当q是某个素数p的方幂,即q=p^k,k>=1,且在同构意义下,相同大小的有限域只有一个。

你决定运用这个定理写一个程序来计算同构意义下的不同有限域个数。对于一个给定的输入n,你需要计算有多少个不同构的有限域,他们的大小是不超过n的。

输入

输入文件包含多组测试数据,每组测试数据包含一个正整数n。

输出

输出文件包含多行,对于每行输入,输出阶数(即大小)不超过n的有限域的个数。

输入示例

2
37

输出示例

1

19

其他说明

【样例说明】
不大于2的有限域包括:2
不大于37的有限域包括:2 3 4 5 7 8 9 11 13 16 17 19 23 25 27 29 31 32 37
【数据规模与约定】
对于30%的数据,1 ≤ n ≤ 100
对于100%的数据,1 ≤ n ≤ 40000

思路

别看是区赛第三题,实际上非常简单,正常思路的话判断一下素数再判断一下就行了。但机智的我一瞅数据范围,立刻发现险恶的出题人卡了一下时间,于是当机立断地选择用素数筛。

代码

#include<iostream>
using namespace std;
int isprime[40005]; 
int isprime_k[40005];
int n,ans;
int main() {
	while(cin>>n){
		ans=0;
		//把素数的倍数置成1 
		for(int i=2;i<=n;i++){
			if(!isprime[i]){
				for(int j=i+i;j<=n;j+=i) isprime[j]=1;
			}
		}
		//如果为0,则把它和他的倍数置成1 
		for(int i=2;i<=n;i++){
			if(!isprime[i]){
				for(int j=i;j<=n;j*=i) isprime_k[j]=1;
			}
		}
		for(int i=2;i<=n;i++){
			if(isprime_k[i]) ans++;//按题意统计 
		cout<<ans<<endl;
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhuyifan_jizhi/article/details/81180380
今日推荐