题意:

输入 a 和 b(a>b),求a! / b!的结果最多能被第二个士兵给的数字除多少次。

思路:

a! / b!肯定能把b!约分掉,只留下b+1~a的数字相乘,所以我们求b+1 ~ a的所有数字的素因子数的和。所以最主要是想一个快速求素因子的方法,在素数筛的基础上改造。

    for(int i=2; i<N; i++)
if(!su[i])
{
for(int j=i; j<N; j+=i)//素数筛的基础找到i为素数
{
su[j]=1;
t=j;
while(t%i==0)//对这个素数求余,看有几次方
{
t=t/i;
sum[j]++;
}
}
}

比如求18的素因子数,当i==2时,sum[18]+=1,当i == 3时,sum+=2。

看完整代码:

#include<stdio.h>
#include<vector>
using namespace std;
#define N 5000010
bool su[N+5];
int sum[N+5];
int main()
{
int t,a,b;
for(int i=2; i<N; i++)
if(!su[i])
{
for(int j=i; j<N; j+=i)//素数筛的基础
{
su[j]=1;
t=j;
while(t%i==0)
{
t=t/i;
sum[j]++;
}
}
}
sum[1]=1;
for(int i=1;i<N;i++)
sum[i]=sum[i-1]+sum[i];
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&a,&b);
printf("%d\n",sum[a]-sum[b]);
}
return 0;
}
05-15 11:43