B4092 [CSP-X2021 山东] 疯狂的数列
欢迎报名洛谷网校,期待和大家一起进步!
要解决这个问题,我们需要找到隐藏的数学规律。首先回忆一个基本定理:一个数能被
接下来观察拼接数的特性。比如第
定义数列第
判断条件转化为:
接下来我们可以进行等价转换。两边同乘
这时有一个关键性结论:任意两个连续整数中必然得要有一个是
- 当
k\bmod 3=0 时:k 本身是3 的倍数; - 当
k\bmod 2=0 时:k+1 变为3 的倍数; - 当
k\bmod 1=0 时:两者均不被3 整除;
由此得出结论:当且仅当
统计方法为:
- 满足
k \bmod 3=0 的个数为:\lfloor n/3 \rfloor (\lfloor \rfloor 表示下取整,例如\lfloor 3.14 \rfloor=3 )。 - 满足
k \bmod 3=2 的个数为:\lfloor (n+1)/3\rfloor 。
因此,答案为
参考代码(只展示关键部分):
int cnt0 = n / 3; // k 能被 3 整除的个数,例如 3, 6, 9, ...
int cnt2 = (n + 1) / 3; // k mod 3 等于 2 的个数,例如 2, 5, 8, ...
int ans = cnt0 + cnt2; // 两部分之和就是答案
cout << ans << endl;