• 个人简介

    数论知识点整理

    贝祖定理

    素数筛法

    欧拉函数

    数论分块

    #include <bits/stdc++.h>
    #define int long long
    using namespace std;
    const int N=2e9;
    struct node{
    	int ls,rs,val;
    }d[6000005];
    int n,g,r,mod,l[200005],s[200005],t[200005];
    int query(int &p,int l,int r,int s,int t){
    	if(!p)return 1e15;
    	if(s<=l&&r<=t)return d[p].val;
    	int mid=l+r>>1;
    	int minn=1e15;
    	if(s<=mid)minn=min(minn,query(d[p].lson,l,mid,s,t));
    	if(mid+1<=t)minn=min(minn,query(d[p].rson,mid+1,r,s,t));
    	return minn;
    }
    signed main(){
    	cin>>n>>g>>r;
    	mod=g+r;
    	for(int i=1;i<=n+1;i++){
    		cin>>l[i];
    		s[i]=s[i-1]+l[i];
    	}
    	for(int i=n;i>=1;i--){
    		int p=1;
    		int nxt=min(query(p,1,N,g-t,mod-t-1),query(p,1,N,g+mod-t,N));
    		if(nxt==1e15)t[i]=s[n]-s[i];
    		else t[i]=s[nxt]-s[i]+mod-(s[nxt]-s[i])%mod+t[nxt];
    	}
    }