luogu1829 Краш цифровая форма

Ссылка на тему

проблема

给出\ (п, т (п, т \ le10 ^ 7) \) ,求\ (\ сумма \ limits_ {I = 1} ^ п \ сумма \ limits_ {J = 1} ^ mlcm (I, J) \ )

\ (LCM (I, J) \) представляет собой наименьшее общее кратное I и J

решение

\ (п \ т \)

\ [\ Сумма \ limits_ {I = 1} ^ п \ сумма \ limits_ {J = 1} ^ mlcm (I, J) = \\ \ сумма \ limits_ {I = 1} ^ п \ сумма \ limits_ {J = 1} ^ т \ гидроразрыва {IJ} {НОД (I, J)} \\ = \ сумма \ limits_ {d = 1} ^ й \ сумма \ limits_ {I = 1} ^ {\ lfloor \ гидроразрыва {N} { д} \ rfloor} \ сумма \ limits_ {J = 1} ^ {\ lfloor \ гидроразрыва {т} {d} \ rfloor} IJ [НОД (I, J) = 1] = \ \\ \ limits_ сумму {d = 1} ^ й \ сумма \ limits_ {I = 1} ^ {\ lfloor \ гидроразрыва {N} {d} \ rfloor} \ сумма \ limits_ {J = 1} ^ {\ lfloor \ гидроразрыва {т} {d} \ rfloor} IJ \ сумма \ limits_ {k | I, K | J} \ му (к) \\ = \ сумма \ limits_ {d = 1} ^ й \ сумма \ limits_ {к = 1} ^ {\ lfloor \ гидроразрыва {N} {d} \ rfloor} к ^ 2 \ му (к) \ сумма \ limits_ {I = 1} ^ {\ lfloor \ гидроразрыва {N} {Dk} \ rfloor} I \ просуммировать \ limits_ {j = 1 } ^ {\ lfloor \ гидроразрыва {т} {ах} \ rfloor} J \]

\ (т = дх \)
原式= \ (\ сумма \ limits_ {т = 1} ^ N \ сумма \ limits_ {к | т} K ^ 2 \ му (к) \ гидроразрыва {т} {к} \ Sum \ limits_ {I = 1} ^ {\ lfloor \ гидроразрыва {N} {T} \ rfloor} I \ просуммировать \ limits_ {j = 1} ^ {\ lfloor \ гидроразрыва {M} {T} \ rfloor} J \ )

Найдено два задних \ (\ СУММА \) может быть \ (O (1) \) вычисляется. Тогда как иметь дело с фронтом \ (\ сумма \ limits_ {к | т} к ^ 2 \ мю (к) \ гидроразрыва {т} {к} \) проблема.

Очевидно , что \ (к ^ 2 \ му ( к) \) является мультипликативной функцией, множество \ (Р (п) = п-2 ^ \ MU (п) \) . Так что это на самом деле один перед \ (е * Id (к) \) . Поскольку мультипликативной функции функции свертки или мультипликативной функции . Таким образом , в передней части этой части является мультипликативной функцией. Линейный экран может быть.

Таким образом, в конце концов, как делает эту функцию экрана.

В соответствии с обычной, набор \ (G = F * Id \ ) , чтобы наблюдать \ (г (д ^ р) \) найдены значения \ (G (Q ^ P) = Q ^ PQ ^ {Р-. 1} \) .

Поэтому режим экрана и экран \ (\ varphi \) аналогично.

Тогда вы можете \ (O (п) \) , чтобы сделать.

В самом деле, эта формула может быть найдена в блок теории чисел, то узкое место на самом деле предварительной обработке. Так что это может быть вопрос нужно задать несколько раз версию.

код

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<ctime>
#include<cmath>
using namespace std;
typedef long long ll;
const int N = 1e7 + 5,mod = 20101009;
ll read() {
    ll x = 0,f = 1;char c = getchar();
    while(c < '0' || c > '9') {
        if(c == '-') f = -1; c = getchar();
    }
    while(c >= '0' && c <= '9') {
        x = x * 10 + c - '0'; c = getchar();
    }
    return x * f;
}
int vis[N],tot,pri[N];
ll f[N];
inline ll calc(ll x) {
    return (x * (x + 1) / 2) % mod;
}
int main() {
    ll n = read(),m = read();
    if(n > m) swap(n,m);
    f[1] = 1;
    for(int i = 2;i <= n;++i) {
        if(!vis[i]) { pri[++tot] = i;f[i] = (i - 1ll * i * i) % mod; }
        
        for(int j = 1;j <= tot && pri[j] * i <= n;++j) {
            vis[i * pri[j]] = 1;
            if(i % pri[j] == 0) {
                f[i * pri[j]] = 1ll * f[i] * pri[j] % mod;
                break;
            }
            f[i * pri[j]] = f[i] * f[pri[j]];
        }
    }
    ll ans = 0;
    for(int i = 1;i <= n;++i) {
        ans += f[i] * calc(n / i) % mod * calc(m / i) % mod;
        ans %= mod;
    }
    cout<<(ans + mod) % mod;
    return 0;
}

рекомендация

отwww.cnblogs.com/wxyww/p/luogu1829.html