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