链接:http://icpc.upc.edu.cn/problem.php?cid=1812&pid=2
题意:给出l、r,问[l,r]之内有多少数,该数质因子的总数也是质数,注意r-l<1e6。(12=2*2*3,质因子的总数为3,符合。)
思路:把1e5 内的质数筛出来,然后用这些质数计算[l,r]内数的质因子个数,最后再统计答案即可。看似会超时,其实不会。以前见过类似思想的题,太菜了,没有想起来。。。。。。。。。。
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N =1e5+10;
int prime[N],cnt;
bool vis[N];
struct node
{
int num,tot;
node(){}
node(int num,int tot):num(num),tot(tot){}
}a[N*10];
void get_prime()
{
for(int i=2;i<N;i++)
{
if(!vis[i]) prime[++cnt]=i;
for(int j=1;j<=cnt&&(ll)i*prime[j]<N;j++)
{
vis[i*prime[j]]=1;
if(i%prime[j]==0) break;
}
}
}
int main(void)
{
get_prime();
vis[0]=vis[1]=1;
int l,r,pos,n,ans=0;
scanf("%d%d",&l,&r);
n=r-l+1;
for(int i=l;i<=r;i++)
a[i-l+1]=node(i,0);
for(int i=1;i<=cnt;i++)
{
pos=(l%prime[i])?(prime[i]-l%prime[i])+1:1;
for(int j=pos;j<=n;j+=prime[i])
{
while(a[j].num%prime[i]==0)
{
a[j].tot++;
a[j].num/=prime[i];
}
}
}
for(int i=1;i<=n;i++)
{
if(a[i].num>1) a[i].tot++;
if(!vis[a[i].tot]) ans++;
}
printf("%d\n",ans);
return 0;
}