luogu P1829 [National Team] Crash digital form

Title Description

Seeking (p \ (20,101,009 \) modulo, \ (n-, m \ LE10 ^. 7 \) )
\ [\ sum_ {I =. 1} ^ n-\ sum_ {J =. 1} ^ m \ OperatorName {LCM} (I , j) \]


General idea

Direct push up formula. . .
(Because it is not written with the aligned so does not look good ...) \
[\ sum_. 1} ^ {n-I = \ sum_ {J}. 1 ^ m = \ OperatorName} {LCM (I, J) \]
\ [= \ sum_ {I =. 1} ^ n-\ sum_ {J =. 1} ^ m \ FRAC {I \ Times J} {\ GCD (I, J)} \]
\ [= \ sum_ {I =. 1} ^ n-\ sum_ {J =. 1} ^ m \ sum_ {D | \ GCD (I, J)} \ FRAC {I \ Times J} {D} \]
\ [= \ sum_ {D =. 1} ^ {\ min (n- , m)} \ times d \ times \ sum_ {i = 1} ^ {\ lfloor \ frac {n} {d} \ rfloor} \ sum_ {j = 1} ^ {\ lfloor \ frac {m} {d} \ rfloor} [\ gcd (i
, j) = 1] \ times i \ times j \] the expression that a lot behind the set \ (SUM (n-, m) \) : \
[SUM (n-, m ) = \ sum_ {i = 1
} ^ n \ sum_ {j = 1} ^ m [\ gcd (i, j) = 1] \ times i \ times j \] consider simplify about \ (SUM \) :
\ [SUM (n-, m) = \ sum_ {I =. 1} ^ n-\ sum_ {J =. 1} ^ m [\ GCD (I, J) =. 1] \ Times I \ Times J \]
\ [= \ sum_ {i = 1} ^ n \ sum_ {j = 1} ^ m \ sum_ {d | \ gcd (i, j)} \ mu (d) \ times i \ times j \]
\ [= \ sum_ {d = 1} ^ {\ min (n, m)} \ mu (d) \ times d ^ 2 \ sum_ {i = 1} ^ {\ lfloor \ frac {n} {d} \ rfloor} \ sum_ {j = 1
} ^ {\ lfloor \ frac {m} {d} \ rfloor} i \ times j \] can be found in \ (SUM \) behind that pile (set \ (g (n , m) \) ) can \ (O (1) \) requirements:
\ [G (n-, m) = \ sum_ {I =. 1} ^ n-\ sum_ {J =. 1} ^ mi The \ Times J \]
\ [= \ frac {n \ times
(n + 1)} {2} \ times \ frac {m \ times (m + 1)} {2} \] so \ (sum (n, m) \) can be transformed to : \
[SUM (n-, m) = \ sum_ {D =. 1} ^ {\ min (n-, m)} \ MU (D) \ Times D ^ 2 \ Times G (\ lfloor \ FRAC {n-} {D } \ rfloor, \ lfloor \ frac
{m} {d} \ rfloor) \] this can count on block \ (\ lfloor \ frac {n } {\ lfloor \ frac {n} {d} \ rfloor} \ rfloor \ ) requirements.
Then back to the definition \ (sum \) in place, then:
\ [Ans = \ sum_ {d = 1} ^ {\ min (n, m)} \ times d \ times sum (\ lfloor \ frac {n} {d} \ rfloor, \ lfloor \ frac {m} {d } \ rfloor) \]
like this can still count on the block \ (QwQ \)
so far this question will be solved.


Details Notes

  • \ (long \ long \) must open it.
  • Do not write to hang it! ! !

Reference Code

/*--------------------------------
  Code name: crash.cpp
  Author: The Ace Bee
  This code is made by The Ace Bee
--------------------------------*/
#include <cstdio>
#define rg register
#define int long long 
#define fileopen(x)                             \
    freopen(x".in", "r", stdin);                \
    freopen(x".out", "w", stdout);
#define fileclose                               \
    fclose(stdin);                              \
    fclose(stdout);
const int mod = 20101009;
const int MAXN = 10000010;
inline int min(int a, int b) { return a < b ? a : b; }
inline int read() {
    int s = 0; bool f = false; char c = getchar();
    while (c < '0' || c > '9') f |= (c == '-'), c = getchar();
    while (c >= '0' && c <= '9') s = (s << 3) + (s << 1) + (c ^ 48), c = getchar();
    return f ? -s : s;
}
int vis[MAXN], mu[MAXN];
int num, pri[MAXN], sum[MAXN];
inline void seive() {
    mu[1] = 1;
    for (rg int i = 2; i < MAXN; ++i) {
        if (!vis[i]) mu[i] = -1, pri[++num] = i;
        for (rg int j = 1; j <= num && i * pri[j] < MAXN; ++j) {
            vis[i * pri[j]] = 1;
            if (i % pri[j]) mu[i * pri[j]] = - mu[i];
            else { mu[i * pri[j]] = 0; break; }
        }
    }
    for (rg int i = 1; i < MAXN; ++i)
        sum[i] = (sum[i - 1] + 1ll * i * i % mod * (mu[i] + mod) % mod) % mod;
}
inline int g(int n, int m)
{ return 1ll * n * (n + 1) / 2 % mod * (m * (m + 1) / 2 % mod) % mod; }
inline int f(int n, int m) {
    int res = 0;
    for (rg int i = 1, j; i <= min(n, m); i = j + 1) {
        j = min(n / (n / i), m / (m / i));
        res = (res + 1ll * (sum[j] - sum[i - 1] + mod) * g(n / i, m / i) % mod) % mod;
    }
    return res;
}
inline int solve(int n, int m) {
    int res = 0;
    for (rg int i = 1, j; i <= min(n, m); i = j + 1) {
        j = min(n / (n / i), m / (m / i));
        res = (res + 1ll * (j - i + 1) * (i + j) / 2 % mod * f(n / i, m / i) % mod) % mod;
    }
    return res;
}
signed main() {
//  fileopen("crash");
    seive();
    int n = read(), m = read();
    printf("%lld\n", solve(n, m));
//  fileclose;
    return 0;
}

End Sahua \ (qwq \)

Guess you like

Origin www.cnblogs.com/zsbzsb/p/11280276.html