这里我先给大家看一串代码(能直接看懂我这串代码的含义所在吗?如果可以可以直接走了,这说明你很nb了)
好了在这我会把题目给大家
include <stdio.h>
#define hhh 1000000
long long int dp[hhh+10]={0,0},v[hhh+10];
int main(){
int i,j,k;
for(i=2;i<=hhh;i++){
if(!dp[i]){
for(j=2;j*i<=hhh;j++){
dp[i*j]=1;
}
}
} //筛素数
for(i=2;i<=hhh;i++){
if(!dp[i]){
v[i]=1;
for(j=2;j*i<=hhh;j++){
v[j*i]=v[i]+v[j];
}
}
} //计算质因子的和
for(i=1;i<=hhh;i++){
v[i]+=v[i-1];
} //前缀和
int T;
scanf("%d",&T);
while(T--){
int a,b,number=0;
scanf("%d%d",&a,&b);
printf("%lld\n",v[b]-v[a-1]);
}
}
首先根据题意每个数可以分解为多个质因数的乘积或一个质因数,然后题意中有点绕的地方就是它算了两次和。第一次和是求和是求多少个(个数)质因子相乘,第二个求和是求前缀和。
后面我会继续写一些这种类型的题目,如有错误的地方欢迎在评论指出