CodeForces 546D - Soldier and Number Game(埃氏筛)

题目链接 https://cn.vjudge.net/problem/CodeForces-546D

【题意】
T组数据(T<=1e6)每组数据给定两个数a,b,问a!/b!(a>=b, a,b<=5e6)的素因子个数有多少个?

【思路】
这么多组数据肯定要预处理,设f[x]为x的素因子个数,我们可以利用埃氏筛的思想把f[2]~f[5e6]计算出来,但是题目中还有个阶乘,这里可以发现这样一个规律就是f[x!]=f[(x-1)!]+f[x],所以只需要从前往后,把前面的所有项累加到当前项f[i]上即可

#include<bits/stdc++.h>
using namespace std;

const int maxn=5000050;

bool notprime[maxn];
int f[maxn];

void init(){
    for(int i=2;i<maxn;++i){
        if(!notprime[i]){
            for(int j=i;j<maxn;j+=i){
                int cpy=j;
                while(cpy%i==0){
                    ++f[j];
                    cpy/=i;
                }
                if(j!=i) notprime[j]=true;
            }
        }
    }
    for(int i=2;i<maxn;++i) f[i]+=f[i-1];
}

int main(){
    init();
    int t;
    scanf("%d",&t);
    while(t--){
        int a,b;
        scanf("%d%d",&a,&b);
        int ans=f[a]-f[b];
        printf("%d\n",ans);
    }
    return 0;
}
posted @ 2018-04-14 13:58  不想吃WA的咸鱼  阅读(81)  评论(0编辑  收藏  举报