luogu#P8940. [DTOI 2023] C. 不见故人

[DTOI 2023] C. 不见故人

题目背景

虽然 luanmenglei 已经是成熟的高中生了,但每次提起 luanmenglei 八年级的女朋友时,luanmenglei 都会沉浸在美好的回忆中,不可自拔。

题目描述

给定 n,kn, k 和序列 {an}\{a_n\},你同时有一个临时变量 xx,你可以进行以下操作若干次(也可以是 00 次),一次操作的流程是:

  1. 选定一个区间 [l,r][l,r]i[l,r]\forall i\in[l,r]xgcd(al,al+1,,ar)x\leftarrow \gcd(a_l,a_{l+1},\cdots,a_r)
  2. i[l,r]\forall i\in[l,r]aixa_i\leftarrow x

简而言之,你每次可以选定一个区间并将其中每个数变成这个区间的 gcd\gcd

一次操作的代价是 rl+1+kr-l+1+k,现在你希望把这个序列的每个数都变成相等的,求最小代价和。


如果您不了解 gcd\gcd 或者多元 gcd\gcd 的含义,可以参照如下定义:

  • gcd(a1,a2,,ak)\gcd(a_1,a_2,\dots, a_k) 表示 a1,a2,,aka_1,a_2,\dots, a_k 的最大公约数,即最大的能同时整除 a1,a2,,aka_1,a_2,\dots, a_k 的正整数。

输入格式

第一行两个非负整数 n,kn,k

第二行 nn 个数,表示 {an}\{a_n\}

输出格式

一行一个数,表示答案。

10 3
2 2 2 1 2 2 2 1 2 2 

13
10 0
2 2 2 1 2 2 2 1 2 3 

9
11 0
2 2 2 1 2 2 2 1 1 3 3 
10

提示

【样例 1 解释】

操作一次,选择区间 [1,10][1,10]

【样例 4】

见附加文件中的 old/old4.inold/old4.out

该样例满足测试点 9129\sim 12 的限制。

【样例 5】

见附加文件中的 old/old5.inold/old5.out

该样例满足测试点 131613\sim 16 的限制。

【数据范围与提示】

对于所有数据,保证 1n4×1061\leq n\leq 4\times 10^60k1090\leq k\leq 10^91ai1091\leq a_i\leq 10^9

每个测试点的具体限制见下表:

测试点编号 nn\leq k,aik,a_i\leq 特殊性质
11 10610^6 10910^9 所有数都相等
242\sim 4 44
585\sim 8 100100
9129\sim 12 10001000
131613\sim 16 10610^6
172017\sim 20 4×1064\times 10^6

本题的读入量较大,请选择较快的读入方式,下面提供一种读入策略:

请在代码的开头加入此行:std::ios::sync_with_stdio(false);std::cin.tie(0);

请注意,加入本行后 cin/cout 的效率将大幅提高,保证其能在 250 ms 内读入所有数据,但使用后你仅能使用 cin/cout 流读入数据。