模积和 HYSBZ - 2956 - 整除分块
题目
求\(\sum_{i = 1}^n\sum_{j = 1}^m (n \mod i) (m \mod j)\) 且\(i≠j\)
\(\sum_{i = 1}^n\sum_{j = 1}^m(n - \lfloor\frac{n}{i}\rfloor * i)(m - \lfloor\frac{m}{j}\rfloor * j) - \sum_{i = 1}^{min(n, m)}(n - \lfloor\frac{n}{i}\rfloor * i)(m - \lfloor\frac{m}{i}\rfloor * i)\)
求\(f(n) = \sum_{i = 1}^n(n - \lfloor\frac{n}{i}\rfloor * i) = n^2 - \sum_{i = 1}^ni * \lfloor\frac{n}{i}\rfloor\)
\(\sum_{i = 1}^{min(n, m)}(n - \lfloor\frac{n}{i}\rfloor * i)(m - \lfloor\frac{m}{i}\rfloor * i)\)
令\(n ≤ m\)
$\sum_{i = 1}^{n}(n - \lfloor\frac{n}{i}\rfloor * i)(m - \lfloor\frac{m}{i}\rfloor * i) = \sum_{i= 1} ^ n n * m - n * i\lfloor\frac{m}{i}\rfloor - m * i * \lfloor\frac{n}{i}\rfloor + i * i * \lfloor\frac{n}{i}\rfloor * \lfloor\frac{m}{i}\rfloor $
#include <iostream>
#include <cstdio>
#define ll long long
using namespace std;
const int mod = 19940417;
const int inv = 3323403; //6 在mod下的逆元
ll sum(ll l, ll r){
return (r - l + 1) * (l + r) / 2 % mod;
}
ll sum2(ll x){
return x * (x + 1) % mod * (2 * x + 1) % mod * inv % mod;
}
ll cal(ll n){
ll ans = 0;
for(ll l = 1, r; l <= n; l = r + 1){
r = n / (n / l);
ans = (ans + n * (r - l + 1) % mod - sum(l, r) * (n / l)) % mod;
}
return (ans + mod) % mod;
}
int main(){
ll n, m;
scanf("%lld%lld", &n, &m);
ll ans = cal(n) * cal(m) % mod;
if(n > m)swap(n, m);
ll s1, s2, s3;
for(ll l = 1, r; l <= n; l = r + 1){
r = min(n / (n / l), m / (m / l));
s1 = n * m % mod * (r - l + 1) % mod;
s2 = (n / l) * (m / l) % mod * (sum2(r) - sum2(l - 1) + mod) % mod;
s3 = ((n / l) * m % mod + (m / l) * n % mod) % mod * sum(l, r) % mod;
ans = (ans - (s1 + s2 - s3) % mod + mod) % mod;
}
printf("%lld\n", ans);
return 0;
}
I‘m Stein, welcome to my blog