• spoj2 prime1 (区间筛)


    给定t组询问,每组询问包括一个l和r,要求([l,r])的素数有哪些

    其中(t le 10,1 le l le r le 1000000000 , r-l le 100000)

    QwQ

    我们可以观察到,这个题(r-l)的范围不是很大,而且所要求的区间也是连续的,所以

    我们可以先预处理出(sqrt n)的素数,然后用它们筛掉所要查询的区间里的合数(注意特判1)

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<cmath>
    
    using namespace std;
    
    inline int read()
    {
      int x=0,f=1;char ch=getchar();
      while (!isdigit(ch)) {if (ch=='-') f=-1; ch=getchar();}
      while (isdigit(ch)) {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
      return x*f;
    }
    
    const int maxn = 3e5+1e2;
    
    int check[maxn];
    int prime[maxn];
    int n,m,l,r;
    int tot;
    int oi[maxn];
    
    
    void primee(int n)
    {
    	check[1]=1;
    	for (int i=2;i<=n;i++)
    	{
    		if (!check[i]) prime[++tot]=i;
    		for (int j=1;j<=tot;j++)
    		{
    			if (i*prime[j]>n) break;
    			check[i*prime[j]]=1;
    			if (i%prime[j]==0) break;
    		}
    	}
    }
    
    void solve(int l,int r)
    {
    	for (int i=1;i<=tot;++i)
    	{
    		int p = prime[i];
    		if (prime[i]>r) break;
    		for (int j=(l-1)/p+1;j<=r/p;++j) if (p*j!=prime[i]) oi[p*j-l+1]=1;
    	}
    }
    
    int t;
    
    int main()
    {
      primee(50000);
      cin>>t;
      //for (int i=1;i<=10;i++) cout<<prime[i]<<" "<<endl;
      while (t--)
      {
      memset(oi,0,sizeof(oi));
      l=read(),r=read();
      solve(l,r);
      if (l==1) oi[1]=1;
      for (int i=1;i<=r-l+1;++i)
      {
      	if (!oi[i]) printf("%d
    ",i+l-1);
      }
      cout<<"
    ";
      }
      return 0;
    }
    
    
  • 相关阅读:
    book pile SGU
    Inversions SGU
    蒟蒻LQL的博客
    控制台注入DLL代码
    Windows消息类型
    windows编程中的数据类型
    单链表的创建与遍历
    定义函数指针
    启动外部程序
    dll共享段中一些需要注意的问题
  • 原文地址:https://www.cnblogs.com/yimmortal/p/10160800.html
Copyright © 2020-2023  润新知