给定 n, k 和序列 \{a_n\} ,你同时有一个临时变量 x ,你可以进行以下操作若干次(也可以是 0 次),一次操作的流程是:
简而言之,你每次可以选定一个区间并将其中每个数变成这个区间的 \gcd 。
一次操作的代价是 r-l+1+k ,现在你希望把这个序列的每个数都变成相等的,求最小代价和。
如果您不了解 \gcd 或者多元 \gcd 的含义,可以参照如下定义:
第一行两个非负整数 n,k 。
第二行 n 个数,表示 \{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\leq n\leq 4\times 10^6 , 0\leq k\leq 10^9 , 1\leq a_i\leq 10^9 。
每个测试点的具体限制见下表:
本题的读入量较大,请选择较快的读入方式,下面提供一种读入策略:
请在代码的开头加入此行:std::ios::sync_with_stdio(false);std::cin.tie(0);。
std::ios::sync_with_stdio(false);std::cin.tie(0);
请注意,加入本行后 cin/cout 的效率将大幅提高,保证其能在 250 ms 内读入所有数据,但使用后你仅能使用 cin/cout 流读入数据。
cin/cout
250 ms
操作一次,选择区间 [1,10] 。