素数必然符合题意。
对于合数,如若它是某个素数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; }
时间: 2024-10-10 13:36:14