HELP!MLE60求助

题目:

A. 天天写作业

Problem ID: 1303

Contest ID: 5885

必做题

Memory Limit Exceeded

60 分

Time Limit:

1000ms

Memory Limit:

65536kB

题目描述

暑假作业好多…天天写的头都大了,数学题里有一题,题目很简单,可是把天天纠结了很久了。。。计算从[A,B](闭区间包括A和B, A <= B, 且0<=B <= 1000000000, B - A <= 100000)之间,一共有多少素数?(不要交表!程序不能大于3KB。。。)

输入格式

一行,两个整数,用空格分开,分别是A和B。

输出格式

一行,代表[A,B]之间有多少素数。

样例

Input 1

3 10

Output 1

3

数据范围

A <= B, 且0<=B <= 1000000000, B - A <= 100000

蒟蒻用了两种方法
都是MLE60
1.线性筛:

#include<bits/stdc++.h>
using namespace std;
bool vis[1000000001]={false};
int primes[114514];
int cnt=0,ans=0;
void get_primes(int a,int b){
	for(int i=2;i<=b;i++){
		if(!vis[i]){
			primes[cnt++]=i;
			if(i>=a) ans++;
		}
		for(int j=0;primes[j]*i<=b;j++){
			vis[primes[j]*i]=true;
			if(i%primes[j]==0) break;
		}
	}
}
int main(){
	int a,b;
	cin>>a>>b;
	get_primes(a,b);
	cout<<ans;
	return 0;
}

2.埃式筛法

#include<bits/stdc++.h>
using namespace std;
bool vis[1000000001]={false};
int ans=0;
void get_primes(int a,int b){
	for(int i=2;i<=b;i++){
		if(vis[i] ) continue;
		else{
			ans+=(i>=a)?1:0;
			for(int j=2*i;j<=b;j+=i){
				vis[j]=true;
			}
		}
	}
}
int main(){
	int a,b;
	cin>>a>>b;
	get_primes(a,b);
	cout<<ans;
	return 0;
}

有没有大佬看一下是什么原因

1 个赞

弱弱问一句
MLE是怎么导致的

1 个赞

超内存了

1 个赞

我现在也没对

1 个赞

不能用数组

1 个赞

那还能用啥

1 个赞
#include<bits/stdc++.h>
using namespace std;
int a[100001],m,n,s;
bool zs(int x)
{
	if(x==0||x==1) return 0;
	for(int i=2;i<=sqrt(x);++i)
	if(x%i==0) return 0;
	return 1;
}
int main()
{
	cin>>m>>n;
	for(int i=m;i<=n;++i) if(zs(i)) s++;
	cout<<s;
	return 0;
}

普通筛素数就行了

1 个赞

vector吗

1 个赞

动态数组没学过

1 个赞

AC了

没想到用普通的也可以过

1 个赞

image

1 个赞

这道题感觉很水,普通方法就能过

1 个赞