标签:
/*****************************
CodeForces 546D
Author:herongwei
Created Time: 2016/5/31 13:00:00
File Name : main.cpp
给出一个n,n开始是a!/b!,每次用一个x去整除n得到新的n,
最后当n变成1的时候经过了几轮得分就是这个轮数,
要求最大的分数是多少
[solve]
就是一个求整数质因子个数的题目,
阶乘我们不需要算,我们知道在a>b的时候,
b!都约掉了,那么我们只需计算出每个数的质因数有几个,
然后前缀和计算出1~n的质因子之和,
Input
2
3 1
6 3
Output
2
5
*****************************/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 5e6+10;
LL n,m,dp[maxn];
void init()
{
dp[1]=dp[2]=0;
for(int i=2; i<maxn; ++i)
{
if(!dp[i])
{
for(int j=i; j<maxn; j+=i)
{
dp[j]=dp[j/i]+1;
}
}
}
for(int i=2; i<maxn; ++i)
dp[i]=dp[i]+dp[i-1];
}
int main()
{
//freopen("1.txt","r",stdin);
init();
/*for(int i=0; i<10; ++i)
{
cout<<"i= "<<i<<" "<<dp[i]<<endl;
i= 0 0
i= 1 0
i= 2 1
i= 3 1
i= 4 2
i= 5 1
i= 6 2
i= 7 1
i= 8 3
i= 9 2
}
*/
int t;scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&m);
printf("%I64d\n",dp[n]-dp[m]);
}
return 0;
}
标签:
原文地址:http://blog.csdn.net/u013050857/article/details/51554192