#304ラウンドCodeforces(本部2)(CF546D)兵士と数ゲーム(リニアふるいです)

問題の意味

あなたを与える、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;
}

おすすめ

転載: www.cnblogs.com/mcq1999/p/ShuLun_1.html