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