码迷,mamicode.com
首页 > 其他好文 > 详细

Codefo 546D. Soldier and Number Game

时间:2015-11-28 20:03:58      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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\n",answer[a]-answer[b]);
    }

    return 0;
}

 

Codefo 546D. Soldier and Number Game

标签:

原文地址:http://www.cnblogs.com/mengzhong/p/5003237.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!