CF2117D 学习笔记

进入正题

题意

给定一个长度为 \(n\) 的数组 \(\{a_n\}\),你可以对这个数组进行以下操作使它所有元素全部为 \(0\)
对于这个数组可以进行两种操作:

  1. 对于数组中所有的元素 \(a_i\),将 \(a_i\) 减去 \(i\)
  2. 对于数组中所有的元素 \(a_i\),将 \(a_i\) 减去 \(n-i+1\)

如果经过若干次操作后可以使整个数组变为 \(0\),则输出 yes,否则输出 no

分析

这里给出一个 猎奇 清奇的做法:
设进行第一种操作的次数为 \(x\),第二种操作的次数为 \(y\)大家都是这么做的),则 \(\forall 1 \le i \le n\)

\[a_i = x \cdot i + y \cdot (n - i + 1) \]

稍微整理得

\[a_i = (x - y)i + y(n+1) \]

\[k = x - y \]

\[a_i = ki+y(n+1) \]

所以数列 \(a_n\) 必须是关于 \(i\) 的一个等差数列,公差为 \(k\),令公差 \(d=k\),则

\[a_1=k\cdot1+y(n+1)=d+y(n+1) \]

\[y = \frac{a_1-d}{n+1} \]

由于 \(x\)\(y\) 都是非负整数,则必须满足下列条件:

  • \(n+1 \mid a_1-d\)
  • \(a_1-d \ge 0\)
  • \(x=d+y \ge 0\)
  • 数列 \(\{a_n\}\) 是等差数列

才能使整个数组变为 \(0\),按照这个思路判断即可。
代码我就不放了。

posted @ 2026-02-02 18:43  constexpr_ll  阅读(0)  评论(0)    收藏  举报