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

CodeForces-546D题解
本文介绍了一道来自CodeForces平台的题目546D的解题思路与实现方法,通过预处理求解多个询问情况下a!/b!(a>=b)的素因子个数,采用埃氏筛法进行优化。

题目链接 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;
}

转载于:https://www.cnblogs.com/wafish/p/10465312.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值