198 words
1 minute
Math
2025-11-28

数学部分#

调和级数#

调和级数常常与枚举一起出现,随着枚举次数的增加,枚举规模会减小,一般需要 i=1V1i=lnV\sum_{i=1}^{V}\frac{1}{i}=\ln{V} 来保证复杂度

例题#

CF2144D#

手玩一下(其实是打表),发现答案没有单调性,不能二分,考虑枚举。记V=maxciV=\max{c_{i}}枚举发现,当x>Vx>V时,贡献是一定的,在x<=Vx<=V时,发现价被限制在[0,Vx][0,\frac{V}{x}]里,枚举xx,复杂度为O(VlogV)O(V\log{V})。 由于每次我们需要计算打折后价格为ii的贡献,我们还需要维护一个前缀和来计算原价位于[ix,(i+1)x1][i*x,(i+1)*x-1]的数的个数。 注意不要乘爆了 核心代码

ll ans=-1e18;
for (int i=1;i<=V+1;i++)pr[i]=0;
for (int i=1;i<=V+1;i++)pr[i]=pr[i-1]+ct[i];
for (int i=2;i<=V+1;i++){
ans=std::max(ans,so(i));
}
ll so(int x){
ll res=0,mius=0;
for (int i=1;i*x-(x-1)<=V;i++){
int l=i*x-x+1,r=std::min(V,i*x);
int cnt=pr[r]-pr[l-1];
if (cnt>0)res+=1ll*cnt*i,mius+=std::min(ct[i],cnt);
}
return res-1ll*y*(n-mius);
}
Math
https://fuwari.vercel.app/posts/math/
Author
Ender子浪
Published at
2025-11-28
License
CC BY-NC-SA 4.0