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;
    }
  • 相关阅读:
    第五周作业
    第四周作业
    第三周作业
    第二周作业
    第一周作业
    FileZilla连接centos7失败处理(SSH)
    单例设计模式
    JQuery中的$符号的作用----网摘
    浅谈关于“中文编程”是否会成为中国程序员的一颗“银弹”
    第8周作业 邱鹏 2013551628
  • 原文地址:https://www.cnblogs.com/Fy1999/p/9732608.html
Copyright © 2011-2022 走看看