您的位置:首页 > 其它

【线性筛】【筛法求素数】【约数个数定理】URAL - 2070 - Interesting Numbers

2017-02-02 19:14 447 查看
素数必然符合题意。

对于合数,如若它是某个素数x的k次方(k为某个素数y减去1),一定不符合题意。只需找出这些数。

由约数个数定理,其他合数一定符合题意。

就从小到大枚举素数,然后把它的素数-1次方都排除即可。

#include<cstdio>
#include<cmath>
using namespace std;
#define MAXP 1000100
#define EPS 0.00000001
typedef long long ll;
ll L,R;
bool isNotPrime[MAXP+10];
int num_prime,prime[MAXP+10];
void shai()
{
for(long i = 2 ; i <  MAXP ; i ++)
{
if(! isNotPrime[i])
prime[num_prime ++]=i;
for(long j = 0 ; j < num_prime && i * prime[j] <  MAXP ; j ++)
{
isNotPrime[i * prime[j]] = 1;
if( !(i % prime[j]))
break;
}
}
}
int main()
{
scanf("%I64d%I64d",&L,&R);
shai();
int sum=0;
for(int i=0;i<num_prime;++i)
{
ll t=(ll)prime[i];
for(int j=1;;++j)
{
bool flag=1;
for(int k=prime[j-1];k<prime[j];++k)
{
if(log(t)+log(prime[i])-log(R)>EPS)
{
flag=0;
break;
}
t*=(ll)prime[i];
}
if(!flag)
break;
if(t>=L)
++sum;
}
}
printf("%I64d\n",R-L+1ll-(ll)sum);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: