#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让我很不敢相信……为什么单独那个点会空间超限?后来我改了一下
#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掉?求大佬解释