CodeForces 546D(求质因数的个数)

来源:互联网 发布:小说有声阅读软件 编辑:程序博客网 时间:2024/06/10 02:45

CodeForces 546D(求质因数的个数)

  1. 题目链接
  2. 题目大意:求(a!/b!)的所有质因数个数的总和
  3. 解题思路:刚开始的时候我是把所有的质数求出来存在一个数组里,对于每一个(a!/b!),求从(b+1)到a的每一个数的质因数的个数,然后再求和,这样在test 4的时候TLE了,然后我就去看了网上的题解,发现是把从1到5000000所有数的质因数全部都求出来,然后求一下前缀和,只要isprime[a]-isprime[b](isprime[i]就是i的质因数的个数)就是答案了。注意这里如果不用前缀和,而是
scanf("%d%d",&a,&b);                int c=a-b;                while(c--)                {                        num+=isprime[a--];                }

直接这样求和的话也会超时。

  1. AC代码
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;int isprime[5000001];int main(){        memset(isprime,0,sizeof(isprime));        for(int i=2;i<=5000000;i++)        {             if(isprime[i]==0)             {                     for(int j=i;j<=5000000;j+=i)//这里等号不能省,注意数据范围                     {                             int q=j;                             while(q%i==0)//这三行这里不能写成isprime[j]++,因为j可能含有好几个i,如果这里不求出j中i的个数,后面也加不上                             {                                     isprime[j]++;                                     q=q/i;                             }                     }             }        }        for(int i=2;i<=5000000;i++)        isprime[i+1]+=isprime[i];        int t;        scanf("%d",&t);        while(t--)        {                int a,b,num=0;                scanf("%d%d",&a,&b);                printf("%d\n",isprime[a]-isprime[b]);        }        return 0;}