筛选素数空间压缩(数论)&& 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;
}



时间: 2024-10-13 21:26:43

筛选素数空间压缩(数论)&& Double Happiness的相关文章

CodeForces114E——Double Happiness(素数二次筛选)

Double Happiness On the math lesson a teacher asked each pupil to come up with his own lucky numbers. As a fan of number theory Peter chose prime numbers. Bob was more original. He said that number t is his lucky number, if it can be represented as:t

uva 10375 唯一分解定理 筛法求素数【数论】

唯一分解理论的基本内容: 任意一个大于1的正整数都能表示成若干个质数的乘积,且表示的方法是唯一的.换句话说,一个数能被唯一地分解成质因数的乘积.因此这个定理又叫做唯一分解定理. 举个栗子:50=(2^1)*(5^2) 题目一般的思路就是要把素数表打出来,eg上面的例子 e={1,0,2,0,0......} 下面是两个题目,仅说说大致的思想: 题目一: E=(X1*X3*X4* ...*Xk)/X2   判断E是不是整数 如果把(X1*X3*X4* ...*Xk)分解成素数相乘,将X2也分解成素

F - Prime Path POJ 3126 筛选素数+bfs

F - Prime Path Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3126 Description The ministers of the cabinet were quite upset by the message from the Chief of Security stating that they would all have t

hdu 2136 (Largest prime factor)就是简单 的筛选素数法

Largest prime factor Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7009    Accepted Submission(s): 2482 Problem Description Everybody knows any number can be combined by the prime number. Now

codeforces 113C C. Double Happiness(数论+暴力)

题目链接: codeforces 113C 题目大意: 找出在[l,r]中的素数t,满足t=a2+b2(a,b为任意正整数),输出这种素数的数量. 题目分析: 首先筛出3?108所有为素数的奇数(偶数除了2都不可能是素数,为了节约内存) 然后枚举范围内的每一个数,判断这个数是不是4*k+1的形式的素数,如果是,那么这个数能够划分成a2+b2的形式,否则不行. AC代码: #include <iostream> #include <cstring> #include <cstd

埃式筛法筛选素数 PAT1013

内容摘要: 明确素数到底是啥数. 埃式筛法是干嘛用的. 利用java实现埃式筛法的思路. 利用埃式筛法解决PAT_1013_B 题. 筛法的改进. 素数(prime number)到底是啥数: 定义: 在大于1的自然数中,除了1和它本身以外不能再被其他数所整除. 实例化定义: 3是素数,因为它不可以被除了"1"以及自身"3"之外的数所整除. 10不是素数,因为它除了"1"以及自身"10"之外,还可以被"2"

埃氏筛选 - 素数的个数

#include <iostream> #include <cstdio> #include <cstdlib> #include <algorithm> using namespace std; const int maxn = 1000000 + 200; int prime[maxn]; //第i个素数 bool is_prime[maxn + 1]; //is_prime[i]位true, 表示i是素数 void solve(); int sieve

线性求欧拉函数值和筛选素数

2818: Gcd 题目: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对(x,y)有多少对. 1<=N<=10^7 算法: 求解 g = Gcd(x,y)为素数,转换问题成x/g,y/g互质.所以,只要求出[1,N/pi]内互质的对数(pi为1....N之间的素数).枚举pi就可以了.而这里就可以用到线性的欧拉求解,普通欧拉为O(nlognlogn). /* 线性素数加欧拉筛法O(N) 题目: 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数

BZOJ1053 [HAOI2007]反素数ant 数论

欢迎访问~原文出处--博客园-zhouzhendong 去博客园看该题解 传送门 - BZOJ1053 题目描述 对于任何正整数x,其约数的个数记作g(x).例如g(1)=1.g(6)=4.如果某个正整数x满足:g(x)>g(i) 0<i<x,则称x为反质数.例如,整数1,2,4,6等都是反质数.现在给定一个数N,你能求出不超过N的最大的反质数么? (1<=N<=2,000,000,000) 题解 对于任何一个反素数p,总有: p=2q1×3q2×5q3×7q4... 而且q