标签:
Description
两个士兵在玩一个游戏,开始的时候第一个士兵选择一个数n,并把这个数交给第二个士兵,第二个士兵必须选择一个x满足x>1 且n能被x整除,然后将n变为n/x,然后把这个数交给第一个士兵,依次循环,当n等于1时,游戏结束,第二个士兵所得的分数为他执行的游戏轮数(选择x的次数)。
为了使游戏更有趣…,第一个士兵选择的n满足如下的形式 a!/b!(a>=b), a!表示a的阶乘。
第二个士兵得到的最大分数是多少?
Input
第一行包含一个整数t (1 ≤t≤ 1 000 000),表示士兵玩游戏的次数。
接下来有t行,每行两个整数a, b(1 ≤b≤a≤ 5 000 000),用来表示n(一开始第一个士兵选择的数n)。
Output
每一次游戏输出第二个士兵能够得到的最大分数。
Sample Input
2
3 1
6 3
Sample Output
2
5
质因数分解,再前缀和处理
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<cmath>
5 using namespace std;
6 #define max 5000005
7 int a[max];
8 int main()
9 {
10 int t,r,l,k,i,j;
11 while(scanf("%d",&t)!=EOF)
12 {
13 for(i=2;i<max;i++)
14 if(!a[i])//确保质因数的倍数已经遍历过,不再重复遍历
15 {
16 for(j=i;j<max;j+=i)
17 {
18 k=j;
19 while(k%i==0)
20 {
21 a[j]++;
22 k/=i;
23 }
24 }
25 }
26 for(i=2;i<max;i++)
27 a[i]+=a[i-1];
28 while(t--)
29 {
30 scanf("%d%d",&r,&l);
31 printf("%d\n",a[r]-a[l]);
32 }
33 }
34 return 0;
35 }
标签:
原文地址:http://www.cnblogs.com/WHLdbk/p/5724244.html