ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2022暑假“雅礼集训”Day2

2022-07-17 18:44:51  阅读:133  来源: 互联网

标签:frac int tr sum Day2 varphi 雅礼 ls 2022


cyj 的场哦/qq/qq/qq

考场 80+30+40 但感觉最后一题或者第一题是要做出来的……

P5572 CmdOI2019 简单的数论题

\[ \sum_{i=1}^n\sum_{j=1}^m \varphi(\frac{ij}{\gcd^2(i,j)})=\sum_{d=1}^n \sum_{i=1}^{[\frac nd]}\sum_{j=1}^{[\frac md]}\varphi(i)\varphi(j)[(i,j)=1] =\sum_{d=1}^n \sum_{k=1}^{[\frac nd]}\mu(k)\sum_{i=1}^{[\frac n{dk}]}\sum_{j=1}^{[\frac m{dk}]}\varphi(ik)\varphi(jk) =\sum_{T=1}^n \sum_{k|T}\mu(k)\sum_{i=1}^{[\frac nT]}\sum_{j=1}^{[\frac mT]}\varphi(ik)\varphi(jk) \]

方便书写,我们定义 \(G(x,y)=\sum \limits_{i=1}^x \varphi(iy),S(x,y,z)=\mu(z)G(x,z)G(y,z)\)

\[ Ans=\sum_{T=1}^n \sum_{k|T}\mu(k)G([\frac nT],k)G([\frac mT],k)=\sum_{T=1}^n \sum_{k|T}S([\frac nT],[\frac mT],k) \]

为了数论分块,我们定义 \(H(x,y,z)=\sum\limits_{i=1}^z \sum\limits_{k|i} S(x,y,k)\),这样数论分块时的答案就是 \(H([\frac nT],[\frac mT],r)-H([\frac nT],[\frac mT],l-1)\)

P5609 Ynoi2013 对数据结构的爱

其实是不久前才看见的套路,现在就想不到了!对于区间 \([l,r]\) 设 \(dp_k\) 表示要使在此区间中减 \(k\) 次进去时候的最小值。其余随便编。

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 1e16
const int maxn=1e6+10;
const int mod=1e9+7;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
	return x*f;
}
int n,m,p,a[maxn],Sum[maxn<<2];
vector<int>tr[maxn<<2];
inline void build(int h,int l,int r){
	tr[h].resize(r-l+3);
	tr[h][0]=-inf;tr[h][r-l+2]=inf;
	if(l==r){tr[h][1]=p-a[l],Sum[h]=a[l];return;}
	int mid=(l+r)>>1,len=r-l+1;
	int ll=mid-l+1,lr=r-mid,ls=(h<<1),rs=(h<<1|1);
	build(h<<1,l,mid);build(h<<1|1,mid+1,r);
	Sum[h]=Sum[h<<1]+Sum[h<<1|1];
	//printf("l=%lld r=%lld\n",l,r);
	for(int i=len,x=ll;i;--i){
		while(x>i)x--;int flg=0;
		while(!flg){
			while(1){
				if(x<0||i-x>lr)break;
				int l1=tr[ls][x],r1=tr[ls][x+1]-1;
				int l2=tr[rs][i-x]+p*x-Sum[ls],r2=tr[rs][i-x+1]+p*x-Sum[ls]-1; 
				if(l1>r2||l2>r1)break;x--;flg=1;
			}if(!flg)x--;
		}x=x+1;
		tr[h][i]=max(tr[ls][x],tr[rs][i-x]+p*x-Sum[ls]);
		//printf("%lld ",tr[h][i]);
	}//puts("");
}
#define pii pair<int,int>
#define fi first
#define se second
#define mkp make_pair
inline pii query(int h,int l,int r,int x,int y,int sum,int cnt){
	if(l>=x&&r<=y){
		int pos=upper_bound(tr[h].begin(),tr[h].end(),sum)-tr[h].begin()-1;
		return mkp(sum+Sum[h]-p*pos,cnt+pos);
	}int mid=(l+r)>>1;
	if(mid<x)return query(h<<1|1,mid+1,r,x,y,0,0);
	if(mid>=y)return query(h<<1,l,mid,x,y,sum,cnt);
	pii ls=query(h<<1,l,mid,x,y,sum,cnt);
	return query(h<<1|1,mid+1,r,x,y,ls.fi,ls.se);
}
signed main(){
//	freopen("spinosaurus.in","r",stdin);
//	freopen("spinosaurus.out","w",stdout);
	n=read(),m=read(),p=read();
	for(int i=1;i<=n;i++)a[i]=read();
	build(1,1,n);
	for(int i=1,l,r;i<=m;i++){
		l=read(),r=read();
		printf("%lld\n",query(1,1,n,l,r,0,0).fi);
	}
	return 0;
}

标签:frac,int,tr,sum,Day2,varphi,雅礼,ls,2022
来源: https://www.cnblogs.com/syzf2222/p/16487965.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有