CodeForces 546D

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 }

 

posted @ 2016-07-31 23:16  晴雨天  阅读(187)  评论(0编辑  收藏  举报