题目地址:http://acm.timus.ru/problem.aspx?space=1&num=2070
题意:给定区间[L,R],求出满意数
1.既是素数又有素数个因子
2.既是合数又有合数个因子
如果一个数是素数,那么他有2个因子,即素数个因子满足条件1
如果是合数
N=p1^k1 * p2^k2 * p3^k3 *.........pn^kn
N可以如上分解质因数
因子数为 n=(k1+1)*(k2+1)*(k3+1)......(kn+1)
当n为合数时满足条件2
显然找其反例更简单即n为素数时的情况跟少
如果n=(k1+1)*(k2+1)*(k3+1)......(kn+1)n必定为合数
如果n=(k1+1) 且(k1+1)为素数的时候,n必定为素数
即 ans=(r-l+1)-card{ x | x=a^(b-1),a.b为素数 }
#include<bits/stdc++.h>
#define N 1000000
using namespace std;
vector<int> prime;
bool book[N+10];
int k=0;
void pp(){
int i,j;
memset(book,true,sizeof(book));
for(i=2,k=0;i<=N;i++){
if(book[i]){
prime.push_back(i);
for(j=2;j*i<=N;j++)
book[j*i]=false;
}
}
}
int judge(long long a,long long b,long long l,long long r){
long long s=1,i;
for(i=1;i<=b;i++){
s*=a;
if(s>r) return 1;
}
if(s<l) return -1;
return 0;
}
long long slove(long long l,long long r){
int t;
long long ans=0;
bool flag;
for(auto i:prime){
flag=true;
for(auto j:prime){
if(j==2) continue;
t=judge(i,j-1,l,r);
if(t==1) break;
else{
flag=false;
if(t==0) ans++;
}
if(flag) break;
}
}
return ans;
}
int main(){
pp();
long long l,r;
scanf("%lld%lld",&l,&r);
printf("%lld\n",r-l+1 -slove(l,r) );
return 0;
}