0716-Bitset-CF Double Happiness

做了这道题就可以get一个新技能咯,就是传说中都没听过的bitset

 

1. 素数 

【问题描述】 
          找出在[l,r]中的素数t,满足t=a^2+b^2(a,b为任意正整数),输出这种素数的数量。 
【输入】 
          2个整数L,R 
【输出】 
          答案 
【输入样例】 
          6 66 
 
【输出样例】 
        7 
 
【样例解释】 
        对于30%的数据,L,R≤200。 
        对于70%的数据,L,R≤100000。 

 

        对于100%的数据,1<=L<R≤3*10^8。

 

这个题一看就觉得很水啊,但是看看数据范围,我方了。。。。随便怎么搞都不可能开到3*10^8啊!就算用线性筛,也没法保存,god!

那么这时候就有个神奇的东东叫做bitset滚了出来

详情请见下一篇博客(我堆了多少篇下一篇来着。。。不管了),也可以自己百度

反正bitset里一个元素只占1bit(二进制位),而8bit=1byte,所以可以开到3*1e8咯

然后我们根据题目可以推出,如果一个质数是两个数的平方和,那么它一定可以写成4k+1的形式

(感谢zxy大佬的讲解)

证明如下:a^2+b^2=素数,素数除2以外全是奇数,所以a^2+b^2答案是个奇数,

又已知奇数^2=奇数,偶数^2=偶数,奇数+偶数=奇数

 

所以最后答案一定是:(某一个奇数)^2+(某一个偶数)^2

然后用2n+1表示奇数,2n 表示偶数,然后打开括号就可以发现必然是4k+1

那么题目就转化为求l~r之间有多少个4k+1是质数

这就好搞啦,上代码

#include<cstdio>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<bitset>
using namespace std;
bitset<300000000> f;
int l,r;
int main(){
	scanf("%d%d",&l,&r);
	int i,j,k,ans=0;
	if(l<=2&&r>=2) ans=1;
	for(i=3;i*i<=r;i+=2){//i+=2是为了直接忽略偶数,优化一下 
		if(!f[i])
			for(j=i*i;j<=r;j+=2*i)
				f[j]=1; 
	}
	for(i=5;i<=r;i+=4)
		if(l<=i&&!f[i]) ans++;
	printf("%d",ans);
	
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.1 double gauss_ch1(double(*f)(double), int n);求积分∫_(-1)^1 f(x)dx/√(1-x^2 ) 实现n点Gauss-Chebyeshev积分公式;返回积分的近似值。 在区间[-1,1]上关于权函数1/√(1-x^2 )的正交多项为T_n (x)=cos(narccos(x)),T_n (x)在[-1,1]上的n个根是x_k=cos⁡((2k-1)/2n π),k=1,…,n. n点Gauss-Chebyeshev积分公式为∫_(-1)^1 f(x)dx/√(1-x^2 )≈π/n ∑_(k=1)^n f(cos⁡((2k-1)/2n π)) 1.2 double gauss_ch2(double(*f)(double), int n); 求积分∫_(-1)^1 √(1-x^2 ) f(x)dx 实现n点Gauss-Chebyeshev II型积分公式;返回积分的近似值。 在区间[-1,1]上关于权函数√(1-x^2 )的正交多项为U_n (x)=sin⁡((n+1)arccos⁡(x))/sin⁡(arccos⁡(x)) ,U_n (x)在[-1,1]上的n个根是x_k=cos⁡(kπ/(n+1)),k=1,…,n. n点Gauss-Chebyeshev II型积分公式为 ∫_(-1)^1 √(1-x^2 ) f(x)dx≈π/(n+1) ∑_(k=1)^n sin^2 (kπ/(n+1))f(cos⁡(kπ/(n+1))) 1.3 double comp_trep(double (*f)(double), double a, double b);求积分∫_a^b f(x)dx 函数实现逐次减半法复化梯形公式;返回积分的近似值。 1.4 double romberg(double (*f)(double), double a, double b); 求积分∫_a^b f(x)dx 函数实现Romberg积分法;返回积分的近似值。 1.5 double gauss_leg_9(double (*f));求积分∫_(-1)^1 f(x)dx 实现9点Gauss-Legendre求积公式。 使用上面实现的各种求积方法求下面的积分:∫_(-1)^1 e^x √(1-x^2 ) dx (=∫_(-1)^1 (xe^x)/√(1-x^2 ) dx) 使用第3,4,5个函数求积分:∫_0^(π/2) sin⁡x dx (=1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值