zoukankan      html  css  js  c++  java
  • LightOJ 1197 Help Hanzo(区间素数筛法)

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    
    #define maxn 50000
    int vis[maxn], isprime[5200], num[100005], k;
    void prime()//只需要把[1,sqrt(2^31)]之间的素数筛选出来就ok了。
    {
        long long i, j;
        for (k=0,i=2; i<maxn; i++)
            if (vis[i] == 0)
            {
                isprime[k ++] = i;
                for (j=i*i; j<maxn; j+=i)
                    vis[j] = 1;
            }
        //printf ("%lld
    ", k);
    }
    
    int main ()
    {
        int t, l = 1;
        prime ();
        scanf ("%d", &t);
        while (t --)
        {
            int a, b, ans = 0;
            int n;
            scanf ("%d %d", &a, &b);
            n = b - a;//所求区间最大可达下标
            memset (num, 0, sizeof(num));
            for (int i=0; isprime[i]<=(int)sqrt(b)&& i<k; i++)
            {
                int j = 0;
                if (a % isprime[i] != 0 )//第一个需要筛掉的数(j+a) % isprime[i] == 0
                    j = j - a % isprime[i] + isprime[i];
                if (a <= isprime[i])//(j+a) / isprime[i] == 1,则(j+a)是素数,要向下推一个
                    j += isprime[i];
                for ( ; j<=n; j+=isprime[i])
                {
                        num[j] = 1;
                }
            }
            for (int i=0; i<=n; i++)//计算素数的数目
                if (!num[i])
                ans ++;
            if (a == 1)//对这种情况特殊处理
                ans --;
            printf ("Case %d: %d
    ", l ++, ans);
        }
        return 0;
    }
  • 相关阅读:
    防止网站被镜像,被iframe
    PHP实现图片批量压缩
    常规正则表达式
    git安装项目步骤
    Laravel创建自定义 Artisan 控制台命令实例教程
    git常规命令
    JS验证身份证号
    Lucene-索引库的维护
    Lucene-分词器
    Lucene-全文检索
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9732608.html
Copyright © 2011-2022 走看看