模积和 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;
}

posted @ 2020-05-12 15:50  Emcikem  阅读(128)  评论(0编辑  收藏  举报