CF1810H Last Number 题解
CF1810H Last Number 题解
观察发现操作分为两部分,被第 \(x\) 次操作分开,即第一个\(S(x)_{max}\le 2S(x)_{min}\) 的时刻。
Lemma 1
在这个时刻之后,添加的数字一定是最小值。
考虑归纳法,\(i = x\) 显然,对于 \(i\ge x\),假设第 \(i\) 次操作前的序列是 \(S_1, S_2,..., S_k\) 根据归纳假设 \(S_k - S_1 \le S_2\),则对于第 \(i + 1\) 操作,欲证 \(S_{k - 1} - S_k + S_1\le S_2\),显然 \(S_1\le S_2, S_{k - 1} - S_k < 0\),故得证。
Lemma 2
假设 \(d_i = S(i)_{max}\) 对于 \(i\le n - 1\),则 \(d_i = n - \lceil \dfrac{i}{\phi}\rceil + 1\)。
考虑归纳法,对于 \(i = 1\) 显然,对于 \(1\le i\le x\),显然 \(d_i - d_{i + 1}\le 1\),思考 \(d_i = d_{i + 1} + 1\) 的条件:
如果 \(d_{i + 1} = d_i + 1\),当且仅当:
\[\begin{aligned} \sum_{j = 1}^i[d_j - j \ge d_i] + n - d_i + 1&= i\\ \sum_{j = 1}^i[n - \lceil \dfrac{j}{\phi}\rceil + 1 - j \ge n - \lceil \dfrac{i}{\phi}\rceil + 1] + n - (n - \lceil \dfrac{i}{\phi}\rceil + 1) + 1&= i\\ \sum_{j = 1}^i[\lceil \dfrac{j}{\phi}\rceil + j \le \lceil\dfrac{i}{\phi}\rceil]&= i-\lceil \dfrac{i}{\phi}\rceil\\ \sum_{j = 1}^i[\lceil \dfrac{j(\phi + 1)}{\phi}\rceil \le \lceil\dfrac{i}{\phi}\rceil]&= \lfloor \dfrac{i(\phi - 1)}{\phi}\rfloor\\ \end{aligned} \]因为等式成立,所以 \(\lceil \dfrac{j(\phi + 1)}{\phi}\rceil \le \lceil\dfrac{i}{\phi}\rceil\) 当且仅当 \(j\le \lfloor \dfrac{i(\phi - 1)}{\phi}\rfloor\),不妨取 \(j = \lfloor \dfrac{i(\phi - 1)}{\phi}\rfloor + 1\),根据 \(\dfrac{\phi - 1}{\phi}\times\dfrac{\phi + 1}{\phi}=\dfrac 1\phi\) ,\(m_1 = \{\dfrac{i(\phi - 1)}{\phi}\}, m2 = \{\dfrac{i}{\phi}\}\),不难得到 \(m_1+m_2=1\),代入得到:
\[\begin{aligned} \lceil(\lfloor \dfrac{i(\phi - 1)}{\phi}\rfloor + 1) \dfrac{(\phi + 1)}{\phi}\rceil > \lceil\dfrac{i}{\phi}\rceil\\ \lceil\lfloor \dfrac{i(\phi - 1)}{\phi}\rfloor\dfrac{(\phi + 1)}{\phi} + \dfrac{(\phi + 1)}{\phi}\rceil > \lceil\dfrac{i}{\phi}\rceil\\ \lceil(\dfrac{i(\phi - 1)}{\phi}-m_1)\dfrac{(\phi + 1)}{\phi} + \dfrac{(\phi + 1)}{\phi}\rceil > \lceil\dfrac{i}{\phi}\rceil\\ \lceil\dfrac{i}{\phi}-m_1\dfrac{(\phi + 1)}{\phi} + \dfrac{(\phi + 1)}{\phi}\rceil > \lceil\dfrac{i}{\phi}\rceil\\ \lceil\dfrac{i}{\phi}+(1-m_1)\dfrac{(\phi + 1)}{\phi}\rceil > \lceil\dfrac{i}{\phi}\rceil\\ \lceil\dfrac{i}{\phi}+m_2\dfrac{(\phi + 1)}{\phi}\rceil > \lceil\dfrac{i}{\phi}\rceil\\ \end{aligned} \]分析小数部分,\(m_2\dfrac{(\phi + 1)}{\phi} + m_2 > 1\),所以 \(m_2 > \dfrac{\phi}{2\phi+1}\)。
分类讨论
- \(d_i = d_{i + 1} + 1\),则欲证 \(\lceil\dfrac{i + 1}{\phi}\rceil=1 + \lceil\dfrac i\phi\rceil\\\),分析小数部分可以得到 \(\{\dfrac{i}{\phi}\} + \dfrac 1\phi \ge 1\),即 \(m_2 > 1 - \dfrac 1\phi\),由于 \(\dfrac{\phi}{2\phi + 1} = 1 - \dfrac{1}{\phi}\),得证。
- \(d_i = d_{i + 1}\),则欲证 \(\lceil\dfrac{i + 1}{\phi}\rceil= \lceil\dfrac i\phi\rceil\\\) 所以 \(\{\dfrac{i}{\phi}\} + \dfrac 1\phi < 1\),即 \(m_2 < 1 - \dfrac{1}\phi\),同理可证。
因为第二部分新加的数字都是最小值,所以最后的答案可以根据每一次操作的最大值确定,最后奇偶分讨然后用类欧就行。
#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
const int N = 2e5 + 10;
const int p = 1134903170, q = 701408733;
int n, k;
int f(int n, int a, int b, int c) {
	if(!a) return b / c * (n + 1);
	if(a >= c || b >= c) return f(n, a % c, b % c, c) + a / c * n * (n + 1) / 2 + b / c * (n + 1);
	int m = (a * n + b) / c;
	return m * n - f(m - 1, c, c - b - 1, a);
}
int g(int n, int o) {
	int f1 = f(n / 2, 2 * q, p - 1, p);
	int f2 = f((n + 1) / 2 - 1, 2 * q, p - 1 + q, p);
	return (o ? 1 : -1) * (f2 - f1);
}
void work() {
	cin >> n;
	k = (p * n + 1 + 2 * p) / (2 * p + q);
	int ans = ((n - 1 ^ k) & 1 ? 0 : (n + 1));
	ans -= g(n - 1, n + 1 & 1) - g(k - 1, n + 1 & 1);
	ans += (n - k & 1 ? -1 : 1) * k; 
	cout << ans << '\n';
}
signed main() {
	ios::sync_with_stdio(0), cin.tie(0);
	int T; cin >> T;
	while(T --) work();
	return 0;
}

 困难题
        困难题
     
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号