National Team Crash digital form

Solution

Seeking
\ [\ sum_ {i = 1
} ^ {n} \ sum_ {j = 1} ^ {m} lcm (i, j) \] the original formula is equivalent to
\ [\ sum_ {i = 1 } ^ {n } \ sum_ {j = 1}
^ {m} \ frac {ij} {gcd (i, j)} \] old routine, so that \ (GCD (I, J) = D \) , at enumeration \ (D \)
\ [\ sum_ {D =. 1} ^ {n-} \ sum_ {I =. 1} ^ {n-} \ sum_ {J =. 1} ^ {m} [GCD (I, J) = D] \ Times \ frac {ij} {d} \
] undoubtedly raised \ (D \) , \ (D \) of \ (\ frac {ij} { d} \) contributes
\ [\ sum_ {d = 1 } ^ {n} d \ times \ sum_ {i = 1} ^ {\ frac {n} {d}} \ sum_ {j = 1} ^ {\ frac {m} {d}} [gcd (i, j) = 1] \ times ij \]
not put through the brain \ ([gcd (i, j ) = 1] \) to replace
\ [\ sum_ {d = 1 } ^ {n} d \ times \ sum_ {i = 1 } ^ {\ frac {n} {d}} \ sum_ {j = 1} ^ {\ frac {m} {d}} \ sum_ {k | gcd (i, j)} \ mu (k) \ times ij \]
routine enumerate \ (k \)
\[ \sum_{d=1}^{n}d \times \sum_{k=1}^{\frac{n}{d}} \mu(k) \times \sum_{i=1}^{\frac{n}{d}}\sum_{j=1}^{\frac{m}{d}} [k|gcd(i,j)] \times ij \]
继续
\[ \sum_{d=1}^{n}d \times \sum_{k=1}^{\frac{n}{d}} \mu(k) \times \sum_{ik=1}^{\frac{n}{d}}\sum_{jk=1}^{\frac{m}{d}}\times ij \times k^2 \]

\[ =\sum_{d=1}^{n}d \times \sum_{k=1}^{\frac{n}{d}} \mu(k) \times \sum_{i=1}^{\frac{n}{dk}}\sum_{j=1}^{\frac{m}{dk}}\times ij \times k^2 \]

Homing
\ [= \ sum_ {d = 1} ^ {n} d \ times \ sum_ {k = 1} ^ {\ frac {n} {d}} \ mu (k) k ^ 2 \ times \ sum_ { i = 1} ^ {\ frac
{n} {dk}} \ sum_ {j = 1} ^ {\ frac {m} {dk}} \ times ij \] Alternatively column with a number of arithmetic
\ [= \ sum_ {d = 1} ^ {n} d \ times \ sum_ {k = 1} ^ {\ frac {n} {d}} \ mu (k) k ^ 2 \ times \ frac {\ frac {n} {dk} ( \ frac {n} {dk}
+ 1)} {2} \ times \ frac {\ frac {m} {dk} (\ frac {m} {dk} + 1)} {2} \] sift \ ( \ MU (K) K ^ 2 \) , then the number of copy number on the block on the block.

Complexity of about \ (O (n) \)

To film everywhere.

Code

#include <bits/stdc++.h>
using namespace std;
#define re register
#define F first
#define S second
typedef long long ll;
typedef pair<int, int> P;
const int N = 1e7 + 5, M = 1e7 + 5, mod = 20101009;
const int INF = 0x3f3f3f3f;
inline int read() {
    int X = 0,w = 0; char ch = 0;
    while(!isdigit(ch)) {w |= ch == '-';ch = getchar();}
    while(isdigit(ch)) X = (X << 3) + (X << 1) + (ch ^ 48),ch = getchar();
    return w ? -X : X;
}
int p[N], mu[N];
ll sum[N];
bool vis[N];
int n, m;
void init(){
    int cnt = 0, k = min(n, m); mu[1] = 1;
    for (int i = 2; i <= k; i++){
        if (!vis[i]) p[++cnt] = i, mu[i] = -1;
        for (int j = 1; j <= cnt && i * p[j] <= k; j++){
            vis[i * p[j]] = 1;
            if (i % p[j] == 0) {
                mu[i * p[j]] = 0; break;
            }
            mu[i * p[j]] = -mu[i];
        }
    }
    for (int i = 1; i <= N; i++) sum[i] = (sum[i - 1] + 1ll * i * i % mod * (mu[i] + mod) % mod) % mod;
}
ll get(int n, int m){
    return (1ll * n * (n + 1) / 2 % mod)  * (1ll * m * (m + 1) / 2 % mod) % mod;
}
ll solsum(int n, int m){
    ll ans = 0;
    for (int i = 1, j; i <= min(n, m); i = j + 1){
        j = min(n / (n / i), m / (m / i));
        ans = (ans + 1ll * (sum[j] - sum[i - 1] + mod) % mod * get(n / i, m / i) % mod) % mod;
    }
    return ans;
}
ll solve(int n, int m){
    ll ans = 0;
    for (int i = 1, j; i <= min(n, m); i = j + 1){
        j = min(n / (n / i), m / (m / i));
        ans = (ans + 1ll * (j - i + 1) * (i + j) / 2 % mod * solsum(n / i, m / i) % mod) % mod;
    }
    return ans;
}
int main(){
    n = read(), m = read();
    init();
    printf("%lld\n", solve(n, m));
    return 0;
}

Guess you like

Origin www.cnblogs.com/lyfoi/p/11443357.html