首页 > 其他分享 >POJ2739 Sum of Consecutive Prime Numbers&&Acwing4938 连续质数之和

POJ2739 Sum of Consecutive Prime Numbers&&Acwing4938 连续质数之和

时间:2023-05-07 11:22:22浏览次数:43  
标签:Prime ch Sum sum st while include 质数 define

方法:单调队列

为什么是单调队列?因为这里让我们求连续的质数和,我们可以利用欧拉筛来维护质数,再利用单调队列来维护连续的质数。

代码( POJ 不支持 C++ 11 差评):

#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cctype>
namespace FastIo{
	#define gc getchar()
	#define pc(ch) putchar(ch) 
    struct QIO{
    	char ch;
    	int st[40];
    	template<class T>inline void read(T &x){
    		x=0,ch=gc;
    		while(!isdigit(ch))ch=gc;
    		while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=gc;}
		}
		bool pd;
		template<class T>inline void write(T a){
			do{st[++st[0]]=a%10;a/=10;}while(a);
			while(st[0])pc(st[st[0]--]^48);
			pc('\n');
		}
	}qrw;
}
using namespace FastIo;
#define NUMBER1 10000
#define P(A) A=-~A
#define fione(i,a,b) for(register int i=a;i<=b;P(i))
int prime[NUMBER1+5],cnt(0),head,tail,sum;
bool st[NUMBER1+5];
inline void PRIME(){
    st[1]=true;
    fione(i,2,NUMBER1){
        if(!st[i])prime[++cnt]=i;
        for(register int j(1);prime[j]*i<=NUMBER1&&j<=cnt;P(j)){
            st[prime[j]*i]=true;
            if(!i%prime[j])break;
        }
    }
}
signed main(){
    PRIME();
    int n,ans;
    bool pd;
    while(1){
        qrw.read(n);
        if(!n)break;
        head=1,tail=0,sum=0,ans=0;
        fione(i,1,cnt){
            while(head<=tail&&sum>n)sum-=prime[head],P(head);
            if(sum==n)P(ans);
            tail=i,sum+=prime[i];
        }
        while(head<=tail&&sum>n)sum-=prime[head],P(head);
        if(sum==n)P(ans);
        qrw.write(ans);
    }
    exit(0);
    return 0;
}

这是我在 Acwing 提交的代码:

#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cctype>
typedef long long LL;
typedef unsigned long long ULL;
namespace FastIo{
    typedef __uint128_t ULLL;
    static char buf[100000],*p1=buf,*p2=buf,fw[100000],*pw=fw;
    #define gc p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++
    inline void pc(const char &ch){
    	if(pw-fw==100000)fwrite(fw,1,100000,stdout),pw=fw;
    	*pw++=ch;
	}
    #define fsh fwrite(fw,1,pw-fw,stdout),pw=fw
	struct FastMod{
        FastMod(ULL b):b(b),m(ULL((ULLL(1)<<64)/b)){}
        ULL reduce(ULL a){
            ULL q=(ULL)((ULLL(m)*a)>>64);
            ULL r=a-q*b;
            return r>=b?r-b:r;
        }
        ULL b,m;
    }HPOP(10);
    struct QIO{
    	char ch;
    	int st[40];
    	template<class T>inline void read(T &x){
    		x=0,ch=gc;
    		while(!isdigit(ch))ch=gc;
    		while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^48);ch=gc;}
		}
		bool pd;
		template<class T>inline void write(T a){
			do{st[++st[0]]=HPOP.reduce(a);a/=10;}while(a);
			while(st[0])pc(st[st[0]--]^48);
			pc('\n');
		}
	}qrw;
}
using namespace FastIo;
#define NUMBER1 10000
#define P(A) A=-~A
#define fione(i,a,b) for(register int i=a;i<=b;P(i))
int prime[NUMBER1+5],cnt(0),head,tail,sum;//prime数组维护质数
bool st[NUMBER1+5];
inline void PRIME(){//维护欧拉筛
    st[1]=true;
    fione(i,2,NUMBER1){
        if(!st[i])prime[++cnt]=i;
        for(register int j(1);prime[j]*i<=NUMBER1&&j<=cnt;P(j)){
            st[prime[j]*i]=true;
            if(!i%prime[j])break;
        }
    }
}
signed main(){
    PRIME();
    int n,ans;
    bool pd;
    while(1){
        qrw.read(n);
        if(!n)break;
        head=1,tail=0,sum=0,ans=0;
        fione(i,1,cnt){
            while(head<=tail&&sum>n)sum-=prime[head],P(head);
            if(sum==n)P(ans);
            tail=i,sum+=prime[i];
        }
        while(head<=tail&&sum>n)sum-=prime[head],P(head);
        if(sum==n)P(ans);
        qrw.write(ans);
    }
	fsh;
    exit(0);
    return 0;
}

标签:Prime,ch,Sum,sum,st,while,include,质数,define
From: https://www.cnblogs.com/SHOJYS/p/17379059.html

相关文章

  • PAT Advanced 1007. Maximum Subsequence Sum
    PATAdvanced1007.MaximumSubsequenceSum1.ProblemDescription:Givenasequenceof\(K\)integers{\(N_1,N_2,...,N_K\)}.Acontinuoussubsequenceisdefinedtobe{\(N_i,N_{i+1},...,N_j\)}where\(1≤i≤j≤K\).TheMaximumSubsequencei......
  • Prometheus之sum_over_time函数
    一、sum_over_timesum_over_time是Prometheus中用于计算指定时间段内时间序列数据的和的函数。它可以对单个时间序列或多个时间序列进行操作,并返回指定时间范围内时间序列值的总和。sum_over_time函数的语法如下:sum_over_time(rangevector-expression)其中,range指定......
  • 第十一篇——通达信指标公式编写常用函数(七)——SUMBARS以及MACD底背离(从零起步编写通
    内容提要:本文主要介绍通达信指标公式常用函数SUMBARS以及函数的应用,并且综合运用函数来编写MACD底背离。 一、SUMBARS函数简介SUMBARS这个函数名由SUM和BARS两部分组成,SUM在前一篇文章《第十篇——通达信指标公式编写常用函数(六)——SUM、IF(从零起步编写通达信指标公式系......
  • 第十篇——通达信指标公式编写常用函数(六)——SUM、IF(从零起步编写通达信指标公式系列)
    内容提要:本文主要介绍了编写通达信指标公式常用函数SUM、IF,并结合自带OBV指标熟悉函数的使用。 在《第五篇——通达信指标公式编写常用函数(一)——REF、MA、EMA、CROSS(从零起步编写通达信指标公式系列)》这篇文章中讲到均线相关的函数MA,这里简单复习一下。 MA(C,N):收盘价......
  • summarizeabundance.py
    报错信息为:(base)[wz@localhosttemp]$python./summarizeAbundance.py-igene.count-moutput-c'9,16,21'-s',+,+*'-nraw-oeggnog/10t/wz/temp/./summarizeAbundance.py:176:FutureWarning:Thedefaultvalueofnumeric_onlyinDataFrameGr......
  • C Primer Plus 第六版
      取指执行,1秒钟执行10个小目标!!寄存器:存储指令、存储指令地址等指令一般做什么用?移动数据,如从内存移动到寄存器......
  • C++ Primer 5th Edition, Chapter 2, Solutions
    Exercise2.1QuestionsWhatarethedifferencesbetweenint,long,longlong,andshort?Betweenanunsignedandasignedtype?Betweenafloatandadouble?SolutionsThosetypeshavedifferentminimumsizesaslistedinTable2.1.Andadditionalru......
  • C++ Primer 5th 阅读笔记:变量和基本类型
    一些语言的公共特性内建类型,如整型,字符型等;变量,为值绑定的一个名字;表达式和语句,操作值。分支和循环,允许我们条件执行和重复执行;函数,定义抽象计算单元。扩展语言的方式自定义类型;标准库。本章重点学习语言的基本知识和标准库。内建类型;简要介绍自定义类。类型......
  • 「解题报告」ARC103D Distance Sums
    给Kaguya看了一眼,Kaguya用了一分钟切了。我看了一个小时。这就是神吗。考虑一个点往叶子走答案的贡献,显然距离和会变化\(-siz_u+(n-siz_u)=n-2siz_u\)。如果我们以重心为根,那么所有的\(n-2siz_u>0\),那么这实际上是一个小根堆。那么我们考虑从大往小枚举叶子,然......
  • AtCoder Regular Contest 125 F Tree Degree Subset Sum
    洛谷传送门AtCoder传送门首先将度数\(-1\)。设\(f_i\)为体积为\(i\)至多能用几个物品凑出来,\(g_i\)为至少。我们现在要证明一个东西:\(x\in[g_i,f_i]\),\((i,x)\)合法。首先若\((s,x)\)合法,那么必须满足\(s-x\in[-z,z-2]\),其中\(z=\sum\limits_{i=1}......