https://vj.xtuacm.cf/contest/view.action?cid=57#problem/P
biset参考资料:http://www.cnblogs.com/boloyonghao/archive/2012/07/12/2588599.html
使用bitset之后筛法速度更快节省了空间时间 可以再亿级范围内使用
头文件:
#include<bisset>
using std::bitset;
一句话定义:可自定义位数,用作记录二进制的数据类型.
一,定义和初始化
bitset b; //b有n位,每位都为0;
bitset b(u); //b是unsigned long型u的副本
bitset b(s); //b是string对象s中含有n位字符串的副本
bitset b(s, pos, n); //b是s中从pos位置开始的n个位置的副本
bitset b(s,pos); //b从s的pos位置开始取值到s末尾(注取的值从b的右端开始)
注:①n定义的位数在初始化时按初始值填充,赋值超出的范围舍去,空余的以零填充.
②bitset从string对象读入位集时按从右到左的顺序.
二,操作
b.any(); //查找b是否存在1?
b.none(); //b中不存在1吗?
b.count(); //b中1的个数
b.size(); //b的位数
b[pos]; //访问b中pos处的数值
b.test(pos); //检测b中pos处是否为1
b.set(); //把b中所有位 置为1
b.set(pos); //把b中pos位置为1
b.reset(); //把b中所有位置为0
b.reset(pos); //把b中pos位置为0
b.flip(); //b中所有二进制位取反
b.flip(pos); //b中在pos处的二进制位取反
b.to_ulong; //返回一个同值得unsigned long值
os << b; //把b中位集输出
关于本题:
bool型占一个字节,bitset专门针对位,以位为单位可以将开销降到最小
题意:由费马平方和定理我们知道,一个奇素数能表为平方和,那么它一定形如4k+1型的,现在给一个区间[l,r],其中,求在此区间有多少个4k+1型的素数。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bitset>
#define ll long long
using namespace std;
const int N = 300000005;
bitset<N> prime;
int main ()
{
ll left,right,i;
scanf("%I64d %I64d",&left,&right);
prime.set(); //所有位置置1
for (i=3; i*i<=right; i+=2)
if(prime[i])
for (ll j=i*i; j<=right; j+=2*i)
prime[j]=false;
int ans=0;
if(left<=2&&right>=2)
ans++;
for(int i=5;i<=right;i+=4)
if(i>=left&&prime[i])
ans++;
cout<<ans<<endl;
return 0;
}