社区讨论
MLE?
P7588双重素数(2021 CoE-II A)参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @loba2cqa
- 此快照首次捕获于
- 2023/10/29 17:37 2 年前
- 此快照最后确认于
- 2023/11/03 23:34 2 年前
CPP
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 1e8, M = 5761455;
int n, l, r, t, ans;
bool pr[N+5];
int Prime[M+5];
int tot, num;
int sum(int n)//作用是求出每位之和
{
int sum=0;
while (n != 0)
{
sum += n%10;
n /= 10;
}
return sum;
}
void prime()//线性筛出素数
{
for (int i=2; i<=N; i++)
{
if (!pr[i])
Prime[++tot]=i;
for (int j=1; i*Prime[j]<=N; j++)
{
pr[i*Prime[j]] = true;
if (!(i%Prime[j]))
break;
}
}
for (int i=1; i<=tot; i++)
if (!pr[sum(Prime[i])])
Prime[++num] = Prime[i];
}
int main()
{
scanf ("%d", &t);
prime();
while (t--)
{
scanf ("%d%d", &l, &r);
ans = 0;
for (int i=l; i<=r; i++)
if (upper_bound(Prime+1, Prime+num+1, i)-lower_bound(Prime+1, Prime+num+1, i) != 0)
ans++;
//二分寻找答案
printf ("%d\n", ans);
}
return 0;
}
码风奇特不管了
T了3个,M了1个。或许二分还可以写的更简洁一点,但是MLE让我很不敢相信……为什么单独那个点会空间超限?后来我改了一下
CPP#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int N = 1e8, M = 5761455;
int n, l, r, t, ans;
bool pr[N+1];
int Prime[M+1];
int tot, num;
int sum(int n)
{
int sum=0;
while (n != 0)
{
sum += n%10;
n /= 10;
}
return sum;
}
void prime()
{
for (int i=2; i<=N; i++)
{
if (!pr[i])
Prime[++tot]=i;
for (int j=1; i*Prime[j]<=N; j++)
{
pr[i*Prime[j]] = true;
if (!(i%Prime[j]))
break;
}
}
for (int i=1; i<=tot; i++)
if (!pr[sum(Prime[i])])
Prime[++num] = Prime[i];
}
int main()
{
scanf ("%d", &t);
prime();
while (t--)
{
scanf ("%d%d", &l, &r);
printf("%d\n", upper_bound(Prime+1, Prime+num+1, r)-Prime-(lower_bound(Prime+1, Prime+num+1, l)-Prime));
}
return 0;
}
然而TLE的事解决了,MLE的问题还是存在。。。
我不能理解的就是我开的数组,数组里面的内容都是差不多的嘛,为什么会单独一个点M掉?求大佬解释
回复
共 0 条回复,欢迎继续交流。
正在加载回复...