P3935 学习笔记
我们要求
\[\sum_{k=l}^r d(k) \bmod 998244353
\]
的值。
我们记
\[S(n)=\sum_{k=1}^n d(k)
\]
则
\[\sum_{k=l}^r d(k)=S(r)-S(l-1)
\]
而
\[S(n)=\sum_{k=1}^n \lfloor \frac nk \rfloor
\]
整除分块即可。
code
#include <bits/stdc++.h>
#define pub public:
#define pri private:
#define fri friend:
#define Ofile(s) freopen(s".in", "r", stdin), freopen (s".out", "w", stdout)
#define Cfile(s) fclose(stdin), fclose(stdout)
#define fast ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
using namespace std;
using ll = long long;
using ull = unsigned long long;
using lb = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pil = pair<int, ll>;
using pli = pair<ll, int>;
constexpr int mod = 998244353;
constexpr int maxn = 2e5 + 5;
ll l, r;
ll calc(ll n);
int main() {
freopen("std.in", "r", stdin);
freopen("std.out", "w", stdout);
fast;
cin >> l >> r;
cout << (calc(r) - calc(l - 1) + mod) % mod;
return 0;
}
ll calc(ll n){
ll res = 0;
for (ll pl = 1, pr; pl <= n; pl = pr + 1){
pr = n / (n / pl);
res = (res + (n / pl) % mod * (pr - pl + 1) % mod) % mod;
}
return res;
}

浙公网安备 33010602011771号