[CodeForces1603D] Artistic Partition(四边形不等式 + 决策单调性优化dp + 分治 + 线性筛 + 数论分块)

problem

codeforces

对于给定的正整数 l≤l\leql,定义 c(l,r)c(l,r)c(l,r) 为满足下列条件的正整数对 (i,j)(i,j)(i,j) 的数量:

  • l≤i≤j≤rl\leq i\leq j\leq rlijr
  • gcd⁡(i,j)≥l\gcd(i,j)\geq lgcd(i,j)l

给定正整数 k≤nk\leq nkn

对所有满足 0=x1<x2<⋯<xk<xk+1=n0=x1<x2<⋯<xk<xk+1=n0=x1<x2<<xk<xk+1=n 的整数序列 (x1,...,xk+1)(x_1,...,x_{k+1})(x1,...,xk+1)

计算 ∑i=1kc(xi+1,xi+1)\sum_{i=1}^kc(x_i+1,x_{i+1})i=1kc(xi+1,xi+1) 的最小值。

你需要回答 TTT 组询问。

对全部数据,1≤T≤3×1051\leq T\leq 3\times 10^51T3×1051≤k≤n≤1051\leq k\leq n\leq 10^51kn105

solution

先设 f(i,k):f(i,k):f(i,k): 枚举到 iii 一共划分了 kkk 个组的最小值。

则有转移 f(i,k)=min⁡j≤i{f(j−1,k−1)+c(j,i)}f(i,k)=\min_{j\le i}\Big\{f(j-1,k-1)+c(j,i)\Big\}f(i,k)=minji{f(j1,k1)+c(j,i)}

但遗憾的是,时间空间双双起飞,而且空间并不能滚动掉。

不妨挖掘一下 c(l,r)c(l,r)c(l,r) 的性质:

  • ovservation1:\text{ovservation1}:ovservation1: c(l,r)≥r−l+1c(l,r)\ge r-l+1c(l,r)rl+1。显然至少每个 i∈[l,r],(i,i)i\in[l,r],(i,i)i[l,r],(i,i) 点对就能提供一次贡献。
  • observation2:c(i,2i−1)=i\text{observation2}:c(i,2i-1)=iobservation2:c(i,2i1)=i。显然 [i,2i−1][i,2i-1][i,2i1] 中的任意两个数的 gcd⁡<i\gcd<igcd<i

基于以上两个观察,不难得出当 n<2kn<2^kn<2k 时,答案一定为 nnn

因为我们有足够多的组数可以分成形如 c(i,2i−1)c(i,2i-1)c(i,2i1) 的形式。

所以我们状态设计的第二维就可以降成 log⁡\loglog 级别。空间问题已经被解决了。

接下来考虑时间复杂度,其直接挂钩于优化 c(l,r)c(l,r)c(l,r) 的计算。
c(l,r)=∑i=lr∑j=ir[gcd⁡(i,j)≥l]=∑d=lr∑i=lr∑j=ir[gcd⁡(i,j)=d]=∑d=lr∑i=⌈ld⌉⌊rd⌋∑j=i⌊rd⌋[gcd⁡(i,j)=1]=∑d=lr∑i=1⌊rd⌋∑j=i⌊rd⌋[gcd⁡(i,j)=1]=∑d=lr∑j=1⌊rd⌋∑i=1j[gcd⁡(i,j)=1]=∑d=lr∑i=1⌊rd⌋φ(i)c(l,r)=\sum_{i=l}^r\sum_{j=i}^r[\gcd(i,j)\ge l]=\sum_{d=l}^r\sum_{i=l}^r\sum_{j=i}^r[\gcd(i,j)=d]\\ =\sum_{d=l}^r\sum_{i=\lceil\frac{l}{d}\rceil}^{\lfloor\frac rd\rfloor}\sum_{j=i}^{\lfloor\frac rd\rfloor}[\gcd(i,j)=1]=\sum_{d=l}^r\sum_{i=1}^{\lfloor\frac rd\rfloor}\sum_{j=i}^{\lfloor\frac rd\rfloor}[\gcd(i,j)=1]\\ =\sum_{d=l}^r\sum_{j=1}^{\lfloor\frac rd\rfloor}\sum_{i=1}^j[\gcd(i,j)=1]=\sum_{d=l}^{r}\sum_{i=1}^{\lfloor\frac rd\rfloor}\varphi(i) c(l,r)=i=lrj=ir[gcd(i,j)l]=d=lri=lrj=ir[gcd(i,j)=d]=d=lri=dldrj=idr[gcd(i,j)=1]=d=lri=1drj=idr[gcd(i,j)=1]=d=lrj=1dri=1j[gcd(i,j)=1]=d=lri=1drφ(i)
S(n)=∑i=1nφ(i)S(n)=\sum_{i=1}^n\varphi(i)S(n)=i=1nφ(i),即 φ(i)\varphi(i)φ(i) 的前缀和。则 c(l,r)=∑i=lrS(⌊ri⌋)c(l,r)=\sum_{i=l}^rS(\lfloor\frac ri\rfloor)c(l,r)=i=lrS(ir)

O(n)O(n)O(n) 线性筛预处理 φ(i),S(i)\varphi(i),S(i)φ(i),S(i) 后,可以数论分块做到 O(r−l+1)O(\sqrt{r-l+1})O(rl+1) 计算。

考虑进一步地优化转移。

kkk 只与 k−1k-1k1 挂钩。所以状态转移的时候不妨先枚举 kkk 再枚举 iii

对于固定的 kkk,我们简化内层转移写成 f(i)=min⁡j≤i{f(j−1)+c(j,i)}f(i)=\min_{j\le i}\Big\{f(j-1)+c(j,i)\Big\}f(i)=minji{f(j1)+c(j,i)}

看见这种形式的转移方程,我们 打表验证 大胆猜测是决策单调性的。

  • 证明 c(l,r)c(l,r)c(l,r) 区间包含单调性。

    ∀l≤l′≤r′≤r\forall\ l\le l'\le r'\le r llrrc(l′,r′)≤c(l,r)c(l',r')\le c(l,r)c(l,r)c(l,r)。根据 c(l,r)c(l,r)c(l,r) 的定义显然。

  • 证明 c(l,r)c(l,r)c(l,r) 满足四边形不等式(交叉小于包含)。

    ∀l1<l2<r1<r2\forall\ l_1<l_2<r_1<r_2 l1<l2<r1<r2c(l1,r1)+c(l2,r2)≤c(l1,r2)+c(l2,r1)c(l_1,r_1)+c(l_2,r_2)\le c(l_1,r_2)+c(l_2,r_1)c(l1,r1)+c(l2,r2)c(l1,r2)+c(l2,r1)
    c(l1,r2)+c(l2,r1)=∑i=l1r2S(⌊r2i⌋)+∑i=l2r1S(⌊r1i⌋)=∑i=l1l2−1S(⌊r2i⌋)+∑i=l2r2S(⌊r2i⌋)+∑i=l1r1S(⌊r1i⌋)−∑i=l1l2−1S(⌊r1i⌋)=∑i=l1l2−1(S(⌊r2i⌋)−S(⌊r1i⌋))+∑i=l2r2S(⌊r2i⌋)+∑i=l1r1S(⌊r1i⌋)=∑i=l1l2−1(S(⌊r2i⌋)−S(⌊r1i⌋))+c(l2,r2)+c(l1,r1)c(l_1,r_2)+c(l_2,r_1)=\sum_{i=l_1}^{r_2}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_2}^{r_1}S(\lfloor\frac{r_1}{i}\rfloor)\\ =\sum_{i=l_1}^{l_2-1}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_2}^{r_2}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_1}^{r_1}S(\lfloor\frac{r_1}{i}\rfloor)-\sum_{i=l_1}^{l_2-1}S(\lfloor\frac{r_1}{i}\rfloor)\\ =\sum_{i=l_1}^{l_2-1}\Big(S(\lfloor\frac{r_2}{i}\rfloor)-S(\lfloor\frac{r_1}{i}\rfloor)\Big)+\sum_{i=l_2}^{r_2}S(\lfloor\frac{r_2}{i}\rfloor)+\sum_{i=l_1}^{r_1}S(\lfloor\frac{r_1}{i}\rfloor)\\ =\sum_{i=l_1}^{l_2-1}\Big(S(\lfloor\frac{r_2}{i}\rfloor)-S(\lfloor\frac{r_1}{i}\rfloor)\Big)+c(l_2,r_2)+c(l_1,r_1) c(l1,r2)+c(l2,r1)=i=l1r2S(ir2)+i=l2r1S(ir1)=i=l1l21S(ir2)+i=l2r2S(ir2)+i=l1r1S(ir1)i=l1l21S(ir1)=i=l1l21(S(ir2)S(ir1))+i=l2r2S(ir2)+i=l1r1S(ir1)=i=l1l21(S(ir2)S(ir1))+c(l2,r2)+c(l1,r1)
    显然 ∑i=l1l2−1(S(⌊r2i⌋)−S(⌊r1i⌋))≥0\sum_{i=l_1}^{l_2-1}\Big(S(\lfloor\frac{r_2}{i}\rfloor)-S(\lfloor\frac{r_1}{i}\rfloor)\Big)\ge0i=l1l21(S(ir2)S(ir1))0,所以 $ c(l_1,r_2)+c(l_2,r_1)\ge c(l_1,r_1)+c(l_2,r_2)$ 得证。

所以 f(i)f(i)f(i) 是具有决策点单调的性质的。经典 1D1D\text{1D1D}1D1D 类单调性优化。

  • 证明 f(i)f(i)f(i) 具有决策单调性。

    即设 g(i)g(i)g(i)iii 的最佳转移决策点,则 ∀j<ig(j)≤g(i)\forall_{j<i}\ g(j)\le g(i)j<i g(j)g(i)

    y<x<j<iy<x<j<iy<x<j<i,且 f(j)f(j)f(j) 的最佳决策点为 xxx。则有:

    • f(x−1,j)+c(x,j)≤f(y−1,j)+c(y,j)f(x-1,j)+c(x,j)\le f(y-1,j)+c(y,j)f(x1,j)+c(x,j)f(y1,j)+c(y,j)
    • c(y,j)+c(x,i)≤c(y,i)+c(x,j)c(y,j)+c(x,i)\le c(y,i)+c(x,j)c(y,j)+c(x,i)c(y,i)+c(x,j)

    两式相加有:f(x−1)+c(x,j)+c(y,j)+c(x,i)≤f(y−1)+c(y,j)+c(y,i)+c(x,j)f(x-1)+c(x,j)+c(y,j)+c(x,i)\le f(y-1)+c(y,j)+c(y,i)+c(x,j)f(x1)+c(x,j)+c(y,j)+c(x,i)f(y1)+c(y,j)+c(y,i)+c(x,j)

    化简后有:f(x−1)+c(x,i)≤f(y−1)+c(y,i)f(x-1)+c(x,i)\le f(y-1)+c(y,i)f(x1)+c(x,i)f(y1)+c(y,i)

    所以对于 iii 而言,最佳决策点选 xxx 一定优于/不劣于选 yyy

那么我们就对于外层枚举的每一个 kkk,跑决策点的分治。

(l,r,L,R)(l,r,L,R)(l,r,L,R) :处理 i∈[l,r]i\in[l,r]i[l,r] 的最优决策点落在 [L,R][L,R][L,R] 区间内。

mid=l+r2mid=\frac{l+r}2mid=2l+r,先算出 c(R+1,mid)c(R+1,mid)c(R+1,mid),然后 c(i,mid)=c(i+1,mid)+S(⌊midi⌋)c(i,mid)=c(i+1,mid)+S(\lfloor\frac{mid}{i}\rfloor)c(i,mid)=c(i+1,mid)+S(imid)

再从 min⁡(mid,R)\min(mid,R)min(mid,R) 开始 →L\rightarrow LL 枚举 midmidmid 的最佳决策点。

因为最佳决策点编号必须小于自己编号。

再根据 midmidmid 分成左右并把决策点区间分成左右。

复杂度额额额,约莫 O(n+T+knnlog⁡n)O(n+T+kn\sqrt{n}\log n)O(n+T+knnlogn)

code

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define maxn 100005
int T, n, cnt;
int prime[maxn], phi[maxn], vis[maxn], S[maxn];
int f[maxn][20];void sieve( int n = 1e5 ) {phi[1] = 1;for( int i = 2;i <= n;i ++ ) {if( ! vis[i] ) prime[++ cnt] = i, phi[i] = i - 1;for( int j = 1;j <= cnt and i * prime[j] <= n;j ++ ) {vis[i * prime[j]] = 1;if( i % prime[j] == 0 ) {phi[i * prime[j]] = phi[i] * prime[j];break;}else phi[i * prime[j]] = phi[i] * phi[prime[j]];}}for( int i = 1;i <= n;i ++ ) S[i] = S[i - 1] + phi[i];
}int calc( int l, int r ) {int ans = 0;for( int i;l <= r;l = i + 1 ) {i = min( r / ( r / l ), r );ans += S[r / l] * ( i - l + 1 );}return ans;
}void solve( int l, int r, int L, int R, int k ) {if( l > r ) return;int mid = l + r >> 1;int sum = calc( R + 1, mid );int ans = 1e18, pos;for( int i = min( R, mid );i >= L;i -- ) {sum += S[mid / i];if( sum + f[i - 1][k - 1] <= ans )ans = sum + f[i - 1][k - 1], pos = i;}f[mid][k] = ans;solve( l, mid - 1, L, pos, k );solve( mid + 1, r, pos, R, k );
}signed main() {for( int i = 1;i <= 1e5;i ++ ) f[i][1] = i * (i + 1) >> 1;sieve();for( int k = 2;k <= 17;k ++ ) solve( 1, 1e5, 1, 1e5, k );scanf( "%lld", &T );while( T -- ) {int k;scanf( "%lld %lld", &n, &k );if( k > 17 or (1 << k) > n ) printf( "%lld\n", n );else printf( "%lld\n", f[n][k] ); }return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/316307.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3714 [BJOI2017]树的难题

P3714 [BJOI2017]树的难题 题意&#xff1a; 给你一棵 n 个点的无根树。 树上的每条边具有颜色。一共有 m 种颜色&#xff0c;编号为 1 到 m&#xff0c;第 i 种颜色的权值为 ci。 对于一条树上的简单路径&#xff0c;路径上经过的所有边按顺序组成一个颜色序列&#xff0c;…

从壹开始 [ Id4 ] 之一║ 授权服务器 IdentityServer4 开篇讲计划书

哈喽大家周四好&#xff01;时间过的很快&#xff0c;现在已经是三月份了&#xff0c;我的 IdentityServer4 教程也拖了一定的时间了&#xff0c;正好最近有精力学新东西了&#xff0c;主要中间被小伙伴要求写一个管理后台&#xff0c;目前1.0已经上线&#xff08;《权限后台系…

P2664 树上游戏

P2664 树上游戏 题意&#xff1a; 给一个长度为 n 的颜色序列&#xff0c;定义 s(i,j) 为 i 到 j 的颜色数量。以及 sumi∑j1ns(i,j)sum_{i}\sum_{j1}^{n}s(i,j)sumi​∑j1n​s(i,j) 现在求所有的sumisum_{i}sumi​ 题解&#xff1a; 待补 代码&#xff1a;

[SDOI2019] 热闹的聚会与尴尬的聚会

problem luogu-P5361 他的联系薄上有 nnn 位好友&#xff0c;他们两两之间或者互相认识&#xff0c;或者互相不认识。 小 Q 希望在周六办一个热闹的聚会&#xff0c;再在周日办一个尴尬的聚会。 一场热闹度为 ppp 的聚会请来了任意多位好友&#xff0c;对于每一位到场的好友…

.NET 泛型,详细介绍

今天的文章是因为再给一个朋友讲这个的时候随手记录下整理出来的。说白了就是把前辈们曾经给我吹过的我又吹了出去。泛型&#xff1a;是C# FrameWork 2.0 时代 加入进来的&#xff0c;可以说对与Net开发人员来说泛型是无处不再的&#xff0c;喜欢看源码的同学&#xff0c;可能会…

P2257 YY的GCD

P2257 YY的GCD 题意&#xff1a; 求 1≤x≤N,1≤y≤M1 \leq x \leq N,1 \leq y \leq M1≤x≤N,1≤y≤M 且gcd(x, y) 为质数的 (x,y) 有多少对。 题解&#xff1a; 莫比乌斯反演 代码&#xff1a; #include <bits/stdc.h> #include <unordered_map> #define…

【刷题记录】[AtCoder Educational DP Contest] 经典dp类型及方法题解合集

文章目录A - Frog 1B - Frog 2C - VacationD - Knapsack 1E - Knapsack 2F - LCSG - Longest PathH - Grid 1I - CoinsJ - SushiK - StonesL - DequeM - CandiesN - SlimesO - MatchingP - Independent SetQ - FlowersR - WalkS - Digit SumT - PermutationU - GroupingV - Sub…

程序员修神之路--问世间异步为何物?

菜菜哥&#xff0c;今天天气挺热的&#xff0c;我都穿裙子了说吧&#xff0c;什么事&#xff1f;&#xff1f;苦笑一下..... 老大说把所有的接口都改成异步操作异步好呀&#xff0c;最少比同步能提高吞吐量异步是怎么回事呢&#xff0c;能讲讲不&#xff1f;来&#xff0c;凑近…

P3455 [POI2007]ZAP-Queries

P3455 [POI2007]ZAP-Queries 题意&#xff1a; 求满足1≤x≤a,1≤y≤b1\leq x\leq a,1\leq y\leq b1≤x≤a,1≤y≤b&#xff0c;且gcd(x,y)dgcd(x,y)dgcd(x,y)d的二元组(x,y)的数量 题解&#xff1a; 莫比乌斯反演板子 代码&#xff1a; // Problem: P3455 [POI2007]ZAP…

.NET Core 使用MailKit发送电子邮件

点击上方蓝字关注“汪宇杰博客”发送邮件通知的功能在各种系统里都很常见。我的博客也能在有新评论、新回复&#xff0c;或者文章被其他网站引用时向管理员发送邮件。那么在.NET Core里&#xff0c;如何实现发送电子邮件呢&#xff1f;准备工作我的案例会利用微软outlook.com的…

P3327 [SDOI2015]约数个数和

P3327 [SDOI2015]约数个数和 题意&#xff1a; 设 d(x) 为 x 的约数个数&#xff0c;给定 n,m&#xff0c;求 ∑i1n∑j1md(i,j)\sum_{i1}^{n}\sum_{j1}^{m}d(i,j)∑i1n​∑j1m​d(i,j) 题解&#xff1a; 代码&#xff1a; // Problem: P3327 [SDOI2015]约数个数和 // Conte…

[CQOI2018] 解锁屏幕(状压dp)

problem luogu-P4460 solution 题面以及数据告诉我们显然是状压 dpdpdp。 设 f(s,i):f(s,i):f(s,i): 经过的点集 sss 最后一次画的点为 iii 的方案数。 直接枚举下一个之前没被画的点 jjj 转移即可。 f(s∣2j,j)←f(s,i)f(s|2^j,j)\leftarrow f(s,i)f(s∣2j,j)←f(s,i)。 …

C#并行编程(6):线程同步面面观

理解线程同步线程的数据访问在并行&#xff08;多线程&#xff09;环境中&#xff0c;不可避免地会存在多个线程同时访问某个数据的情况。多个线程对共享数据的访问有下面3种情形&#xff1a;多个线程同时读取数据&#xff1b;单个线程更新数据&#xff0c;此时其他线程读取数据…

P2522 [HAOI2011]Problem b

P2522 [HAOI2011]Problem b 题意&#xff1a; 对于给出的 n 个询问&#xff0c;每次求有多少个数对 (x,y)&#xff0c;满足 a≤x≤b&#xff0c;c≤y≤d&#xff0c;且 gcd(x,y)k&#xff0c;gcd(x,y) 函数为 x 和 y 的最大公约数。 题解&#xff1a; 这个题跟P3455 [POI20…

[十二省联考 2019] 异或粽子(可持久化字典树 + 二叉堆)

problem luogu-P5283 小粽是一个喜欢吃粽子的好孩子。今天她在家里自己做起了粽子。 小粽面前有 nnn 种互不相同的粽子馅儿&#xff0c;小粽将它们摆放为了一排&#xff0c;并从左至右编号为 111 到 nnn。 第 iii 种馅儿具有一个非负整数的属性值 aia_iai​。 每种馅儿的数…

.NET Core/Framework 创建委托以大幅度提高反射调用的性能

都知道反射伤性能&#xff0c;但不得不反射的时候又怎么办呢&#xff1f;当真的被问题逼迫的时候还是能找到解决办法的。为反射得到的方法创建一个委托&#xff0c;此后调用此委托将能够提高近乎直接调用方法本身的性能。&#xff08;当然 Emit 也能够帮助我们显著提升性能&…

[省选联考 2020 A/B 卷] 冰火战士(树状数组上二分)

文章目录problemsolution(10pts)code(10pts)solution(30pts)code(30pts)solution(60pts)code(60pts)solution(100pts)code(100pts)problem luogu-P6619 一场比赛即将开始。 每位战士有两个属性&#xff1a;温度和能量。 有两派战士&#xff1a; 冰系战士的技能会对周围造成…

P1829 [国家集训队]Crash的数字表格 / JZPTAB

P1829 [国家集训队]Crash的数字表格 / JZPTAB 题意&#xff1a; 求∑i1n∑j1mlcm(i,j)\sum_{i1}^{n}\sum_{j1}^{m}lcm(i,j)∑i1n​∑j1m​lcm(i,j) 1<n<m<1e7 结果mod20101009 题解&#xff1a; 跟这个题P3911 最小公倍数之和很相近&#xff0c;但是本题数据范围大…

C# 跨设备前后端开发探索

每个人都拥有 好奇心&#xff0c;好奇心驱使着我们总是去尝试做一些有趣的事情。带起你的好奇心&#xff0c;本文将使用 C# 开发各种各样好玩的东西。每个人都拥有 好奇心&#xff0c;好奇心驱使着我们总是去尝试做一些有趣的事情。比如这件事&#xff1a;在好奇心的驱使下&…

Docker最全教程之Python爬网实战(二十二)

Python目前是流行度增长最快的主流编程语言&#xff0c;也是第二大最受开发者喜爱的语言&#xff08;参考Stack Overflow 2019开发者调查报告发布&#xff09;。笔者建议.NET、Java开发人员可以将Python发展为第二语言&#xff0c;一方面Python在某些领域确实非常犀利&#xff…