您的位置:首页 > 其它

51nod 1441 士兵的数字游戏 (模拟线性筛)

2016-01-25 18:19 399 查看
两个士兵正在玩一个游戏,游戏开始的时候,第一个士兵为第二个士兵选一个正整数n。然后第二个士兵要玩尽可能多的轮数。每一轮要选择一个正整数x>1,且n要是x的倍数,然后用n/x去代替n。当n变成1的时候,游戏就结束了,第二个士兵所得的分数就是他玩游戏的轮数。

为了使游戏更加有趣,第一个士兵用 a! / b! 来表示n。k!表示把所有1到k的数字乘起来。

那么第二个士兵所能得到的最大分数是多少呢?

Input
单组测试数据。
第一行包含一个整数t (1 ≤ t ≤ 1,000,000),表示士兵玩游戏的次数。
接下来t行,每行包含两个整数a,b (1 ≤ b ≤ a ≤ 5,000,000)。


Output
对于每一组数据,输出第二个士兵能拿到的最多分数。


Input示例
2
3 1
6 3


Output示例
2
5


#include<iostream>
#include<cstdio>
#include<algorithm>

using namespace std;
const int N = 5000000+10;
long long a
,pre
;
void init()
{
int n=5000000,i,j;
for(i=2;i<=n;i++) {
if(!a[i])
{
for(j=i;j<=n;j+=i){
int temp=j;
while(temp%i==0) {
a[j]++;
temp=temp/i;
}
}
}
pre[i]=pre[i-1]+a[i];
}
}

int main()
{
int t,i,j,s,e;
scanf("%d",&t);
init();
while(t--) {
scanf("%d%d",&e,&s);
printf("%lld\n",pre[e]-pre[s]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: