数据量不超过50000,先筛出50000以内的素数(约5200个),然后在log时间内筛出每个素因子的个数,总复杂度O(nlogn)
#include <stdio.h>
#include <string.h>
#include <math.h>
bool isprime[50010];
int prime[5200],p;
int ct[5200];
int init()
{
p=0;
memset(isprime,0,sizeof(isprime));
for(int i=2;i<=50000;i++)
{
if(!isprime[i])
{
prime[p++]=i;
}
if(i<=223)
for(int j=i*i;j<=50000;j+=i)
isprime[j]=1;
}
}
int solve(int n,int x,int op)
{
int k=prime[x];
while(k<=n)
{
if(op==1)
ct[x]+=n/k;
else
ct[x]-=n/k;
k*=prime[x];
}
}
int main()
{
init();
int m,n;
scanf("%d%d",&n,&m);
int k=n-m;
for(int i=0;i<p;i++)
solve(n,i,1);
for(int i=0;i<p;i++)
solve(m,i,0);
for(int i=0;i<p;i++)
solve(k,i,0);
int ans=0;
for(int i=0;i<p;i++)
if(ct[i]>0)ans++;
printf("%d\n",ans);
return 0;
}