赛后补题时看其他神仙队伍的代码瞎琢磨的,大概率是绕了弯路,欢迎指正!
不妨设:
则:
注意到当 不是完全平方数时, 至少有一个是奇数,我们不妨假设 是奇数。当 时,有 ,所以 有 共 种可能的情况,即偶数种情况。无论 的奇偶性如何,由于 是奇数的情况数跟 是偶数的情况数相同,所以 值为奇数的情况数也一定跟值为偶数的情况数相同,则 。
当 是完全平方数时, 都是偶数,当 时,对于每个 都有 一共是奇数种可能的情况。当 时情况同上。当 时由于 为偶数,则转为讨论 的奇偶性,以此类推,最终转为讨论 的奇偶性,显然 是偶数的情况比 是奇数的情况多一种,所以 值为偶数的情况比值为奇数的情况多一种,则 。
接下来可以使用 整除分块,即枚举 的值,计算此时 的值应该落在哪个区间,假设是 ,只需讨论 中有多少完全平方数即可。
#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'; }