赛后补题时看其他神仙队伍的代码瞎琢磨的,大概率是绕了弯路,欢迎指正!

不妨设:

则:

注意到当 不是完全平方数时, 至少有一个是奇数,我们不妨假设 是奇数。当 时,有 ,所以 种可能的情况,即偶数种情况。无论 的奇偶性如何,由于 是奇数的情况数跟 是偶数的情况数相同,所以 值为奇数的情况数也一定跟值为偶数的情况数相同,则

是完全平方数时, 都是偶数,当 时,对于每个 都有 一共是奇数种可能的情况。当 时情况同上。当 时由于 为偶数,则转为讨论 的奇偶性,以此类推,最终转为讨论 的奇偶性,显然 是偶数的情况比 是奇数的情况多一种,所以 值为偶数的情况比值为奇数的情况多一种,则

接下来可以使用 整除分块,即枚举 的值,计算此时 的值应该落在哪个区间,假设是 ,只需讨论 中有多少完全平方数即可。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD = 998244353;

ll S(ll x)
{
    return sqrt(x);
}

ll n, s;

int main()
{
    cin >> n;
    for (ll l = 1, r; l <= n; l = r + 1)
    {
        r = n / (n / l);
        s = (s + (n / l) * (S(r) - S(l - 1))) % MOD;
    }
    cout << s << '\n';
}