居然被卡了这么长时间 long long 的正确使用……
这个题目就是先 筛出 2到b√ 内的素数, 然后用这些素数埃氏筛法筛 a 到 b 区间内的数。
2945计算素数的话只是数据范围稍大
代码
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long LL;
const LL MAXN = 10000000 + 10;
bool vis[MAXN];
LL prime[MAXN];
int main()
{
LL cnt = 0;
LL a, b;
cin >> a >> b;
memset(vis,0,sizeof(vis));
vis[0] = vis[1] = 1;
for(LL i = 2; i <= sqrt(b); i ++)
{
if(!vis[i]) prime[++cnt] = i;
for(LL j = 1; j <= cnt, i*prime[j] <= sqrt(b); j ++)
{
vis[i*prime[j]] = 1;
if(i%prime[j] == 0)
break;
}
}
memset(vis,0,sizeof(vis));
for(LL i = 1; i <= cnt; i ++)
{
LL p = prime[i];
if(a%p == 0 && a != p)
vis[10] = 1;
for(LL j = a/p*p+p; j <= b; j += p)
if(j != p)
vis[j-a+10] = 1;
}
LL ans = 0;
for(LL i = 10; i <= b-a+10; i ++)
if(!vis[i])
ans ++;
cout << ans << endl;
return 0;
}
/*
//两组数据:
32768 65536
3030
2146443647 2147443647
> 46567
*/
其实本来安排不是给数学的QAQ, 都怪她魅力太大。我太弱ppp……