题解:P10900 [蓝桥杯 2024 省 C] 数字诗意

· · 题解

解题思路:

由于连续自然数的排列是一个等差数列,而一个长度为奇数的等差数列能被转换为相同的奇数个自然数。
例如:

\begin{aligned} 28 &= 1 + 2 + 3 + 4 + 5 + 6 + 7 \\&= 4 + 4 + 4 + 4 + 4 + 4 + 4 \end{aligned}

那么,这个被分拆的数就得满足它等于一个奇数乘一个任意正整数。

反过来讲,不能被分拆为连续自然数的和的数要满足它没有奇因子,也就是 2 的正整数幂,遇到这种数,就增加答案。

由于 a_i \le 10^{16},所以可以租略估算枚举到 60 即可(也就是代表如果 a_i = 2^{60} 要增加答案)。

好吧好像还是很抽象,所以详见代码....

CODE:

#include <iostream>
#include <cmath>
using namespace std;
long long n, a, ans;
int main()
{
    cin >> n;
    while (n--)
    {
        cin >> a;
        for (int i = 1; i <= 60; i++)
        {
            if (a == pow(2, i))
            {
                ++ans;
                break;
            }
        }
    }
    cout << ans;
    return 0;
}