• Codefo 546D. Soldier and Number Game


    题目链接:http://codeforces.com/problemset/problem/546/D

    题意:输入a,b,n=a!/b!,求n 最多除以多少次变为1。

    分析:相当于求n有多少个质因子。即求从b+1到a之间的数字质因子和为多少。

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    int v[5000005];//v[i]记录i是否为质数
    int prime[50000];//素数表
    int num;
    int mini[5000005];//mini[i]表示i的最小质因子。
    int ans[5000005];//ans[i]表示i有多少个质因子。
    int answer[5000005];//answer[i]表示从1到i共有多少个质因子
    
    void init()
    {
        memset(v,0,sizeof(v));
        num=0;
        for(int i=2;i<=5000000;i++)
            mini[i]=i;
        for(int i=2;i<=5000000;i++)
        {
            if(v[i]==0)
            {
                prime[++num]=i;
            }
            for(int j=1;j<=num&&i*prime[j]<=5000000;j++)
            {
                int t=i*prime[j];
                v[t]=1;
                if(mini[t]>prime[j])
                    mini[t]=prime[j];
            }
        }
        ans[2]=1;
        for(int i=3;i<=5000000;i++)
        {
            ans[i]=ans[i/mini[i]]+1;//ans[i]为i除以他的最小质因子的质因子数加上1
        }
        answer[1]=0;
        for(int i=2;i<=5000000;i++)
        {
            answer[i]=answer[i-1]+ans[i];
        }
    }
    
    
    
    int main()
    {
        int t,a,b;
        scanf("%d",&t);
        init();
        while(t--)
        {
            scanf("%d%d",&a,&b);
            printf("%d
    ",answer[a]-answer[b]);
        }
    
        return 0;
    }
  • 相关阅读:
    bzoj1027
    bzoj1069
    poj2079
    poj2187
    bzoj2281
    bzoj2285
    bzoj1558
    bzoj1822
    bzoj1559
    bzoj1570
  • 原文地址:https://www.cnblogs.com/mengzhong/p/5003237.html
Copyright © 2020-2023  润新知