首页 > 代码库 > 筛选素数空间压缩(数论)&& Double Happiness
筛选素数空间压缩(数论)&& Double Happiness
113 C. Double Happiness
题目链接:
Click Here~
先介绍bitset<>的用法:
<用别人有现成>
#include<bister>
using std::bitset;
一句话定义:可自定义位数,用作记录二进制的数据类型.
一,定义和初始化
bitset<n> b; //b有n位,每位都为0;
bitset<n> b(u); //b是unsigned long型u的副本
bitset<n> b(s); //b是string对象s中含有n位字符串的副本
bitset<n> b(s, pos, n); //b是s中从pos位置开始的n个位置的副本
bitset<n> 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中位集输出
/* 由费马平方和定理我们知道,一个奇素数能表为平方和,那么它一定形如4k+1型的 */ #include <iostream> #include <bitset> using namespace std; const int MAXN = 300000000 + 10; bitset<MAXN> primes; int main() { int right,left; while(cin >> left >> right){ if(left > right) swap(left,right); primes.set(); for(int i = 3;i * i <= right;i += 2) if(primes[i]) for(int j = i * i;j <= right;j += (i << 1)) primes[j] = 0; int cnt = (left <= 2&&2 <= right); for(int i = 5;i <= right;i += 4) if(i >= left && primes[i]) cnt++; cout << cnt << endl; } return 0; }
筛选素数空间压缩(数论)&& Double Happiness