問題の意味
あなたを与える、B(1 <= bは、<= A <= 5000000)!/ Bを表し!数字が示され、あなたがこの番号を作るために、すべてのxを(X> 1、xは、多くの要因である)分割することができます彼は!/ Bになりました!/ X、数1になるために何度もお聞きし、最大動作可能
http://codeforces.com/problemset/problem/546/D
考え
明らかに要素分解が、!/ Bを算出直接!スロー実際に計算され発見される素因数の数(1-A)(A-2)......これらの(B + 1)、数場合素因数のすべての素因数の積の数と(操作の数に対応する数で割ったXのそれぞれについて)それぞれに対する素数および因子の数に等しいので、我々は、線形スクリーンを計算します数は、最終的に出力プレフィックスは、実際のO(1)に係合することができます。
コード
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=5e6+5;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
ll sum[N];
int vis[N],prime[N],tot;
void shai()
{
tot=0;
memset(vis,0,sizeof(vis));
for(int i=2;i<N;i++)
{
if(!vis[i])
prime[tot++]=i,sum[i]=1;
for(int j=0;j<tot&&prime[j]*i<N;j++)
{
vis[prime[j]*i]=1;
sum[prime[j]*i]=sum[i]+1;
if(i%prime[j]==0)
break;
}
}
for(int i=2;i<N;i++)
sum[i]+=sum[i-1];
}
int main()
{
std::ios::sync_with_stdio(false);
int n;
shai();
scanf("%d",&n);
while(n--)
{
ll a,b;
scanf("%d%d",&a,&b);
printf("%lld\n",sum[a]-sum[b]);
}
return 0;
}