当前位置: 代码迷 >> 综合 >> 【等差数列】题解
  详细解决方案

【等差数列】题解

热度:52   发布时间:2023-12-06 17:24:50.0

Link

给你一个长为 n n n,首项为 a a a,公差为 d d d 的等差数列。

x x x 中任选两个数 x i , x j x_i,x_j xi?,xj? ,同时满足:

  • x i + x j x_i+x_j xi?+xj? 为偶数。

  • x x x 中没有 x i + x j 2 \frac{x_i+x_j}{2} 2xi?+xj??

那么你就可以将 x i + x j 2 \frac{x_i+x_j}{2} 2xi?+xj?? 加入 x x x 中,称为一次操作。

注意:新加入的数也可被选择。

问你最多能进行几次操作?


蒟蒻第一次打月赛,激动地点开第一题:

哇,好简单!

30min 后,终于 AC 了。(我好菜啊)


正文:

首先,这个数列是等差数列,也就是说,每两个相邻元素所构成的子区间 [ x i , x i + 1 ] [x_i,x_{i+1}] [xi?,xi+1?] 中,能产生的新数是一样的。那么,我们就只用算出每两个元素之间能产生多少个新数,再乘以子区间数 n ? 1 n-1 n?1 即可。

可能大家会有疑问,万一两个不同子区间中产生的新数又产生了新数呢?

其实原因很简单,因为这两个数所产生的新数,必定会由其中一个子区间中的数产生,那么这时候就重复计算了。所以直接把问题简化成计算两个相邻元素产生的新数即可。

我们来推导一下吧:

设有一集合 A A A,当前有两个元素 { A 1 , A 2 } \left \{ A_1,A_2 \right \} { A1?,A2?}

首先判断 A 1 + A 2 A_1+A_2 A1?+A2? 是否是偶数,若不是,则不能再产生数。

根据题目, A 1 A_1 A1? 为首项,公差为 d d d

∴ A 2 = A 1 + d \therefore A_2 = A_1 + d A2?=A1?+d

∴ A 1 + A 2 = 2 A 1 + d \therefore A_1 + A_2 = 2A_1 + d A1?+A2?=2A1?+d

∴ A 1 + A 2 2 = A 1 + d 2 \therefore \frac{A_1 + A_2}{2} = A_1 + \frac{d}{2} 2A1?+A2??=A1?+2d?

所以,判断 A 1 + A 2 A_1 + A_2 A1?+A2? 是否为偶数,就是 d d d 是否为偶数。这也就等于,如果 d d d 为奇数,就连一个数也产生不了,答案为 0 0 0

若设 d d d 为偶数,则第一次后的集合变成了 { A 1 , A 1 + A 2 2 , A 2 } \left \{ A_1,\frac{A_1+A_2}{2}, A_2 \right \} { A1?,2A1?+A2??,A2?}。这个数列也是一个等差数列,因为前后两个子区间产生的新数是一样的,所以直接判断左子区间 { A 1 , A 1 + A 2 2 } \left \{ A_1,\frac{A_1+A_2}{2} \right \} { A1?,2A1?+A2??}。此时 d d d 又更新为 A 1 + A 2 2 ? A 1 \frac{A_1+A_2}{2}-A_1 2A1?+A2???A1?。继续判断 d d d 的奇偶,直到 d d d 为奇数才停止。

又容易发现:

∵ d 1 = A 1 + A 2 2 ? A 1 \because d_1 = \frac{A_1+A_2}{2}-A_1 d1?=2A1?+A2???A1?

∴ d 1 = A 1 2 + A 2 2 ? A 1 = A 2 2 ? A 1 2 = A 2 ? A 1 2 \therefore d_1 = \frac{A_1}{2}+\frac{A_2}{2}-A_1=\frac{A_2}{2}-\frac{A_1}{2}=\frac{A_2-A_1}{2} d1?=2A1??+2A2???A1?=2A2???2A1??=2A2??A1??

∵ d 0 = A 2 ? A 1 \because d_0 = A_2 - A_1 d0?=A2??A1?

∴ d 1 = d 0 2 \therefore d_1 = \frac{d_0}{2} d1?=2d0??

即,每次产生新数后,公差 d d d 就除以 2 2 2

到此,思路就已经出来了。

本题像是一个二分,每次二分子区间,只取左或右区间,每次将 d d d 除以 2 2 2,判断其奇偶。

开始,子区间数量为 1 1 1,没有新数。

第一次,子区间数量为 2 2 2,原来的新数为 0 0 0,产生的新数为 1 1 1,共产生 1 1 1 个数。

第二次,子区间数量为 4 4 4,原来的新数为 1 1 1,产生的新数为 2 2 2,,共产生 3 3 3 个数。

第三次,子区间数量为 8 8 8,原来的新数为 3 3 3,产生的新数为 4 4 4,共产生 7 7 7 个数。

可以发现,设答案为 a n s ans ans,则 a n s i = 2 a n s i ? 1 + 1 ans_i = 2ans_{i-1}+1 ansi?=2ansi?1?+1

Code:

#include <cstdio>
int t;
long long n, a, d;
int main() {
    scanf("%d", &t);while(t--) {
    scanf("%lld %lld %lld", &n, &a, &d);long long ans = 0;while(!(d & 1)) {
    ans = (ans << 1) + 1;d >>= 1;}printf("%lld\n", ans * (n - 1));}return 0;
}