BZOJ2154/BZOJ2693/Luogu1829 Crash的數字表格/JZPFAR 莫比烏斯反演
傳送門——Luogu
傳送門——BZOJ2154
BZOJ2693是權限題
其中JZPFAR是多組詢問,Crash的數字表格是單組詢問
先推式子(默認\(N \leq M\),所有分數下取整)
\(\begin{align*} \sum\limits_{i=1}^N \sum\limits_{j=1}^M lcm(i,j) & = \sum\limits_{i=1}^N \sum\limits_{j=1}^M \frac{ij}{gcd(i,j)} \\ & = \sum\limits_{d=1}^N d\sum\limits_{i=1}^\frac{N}{d} \sum\limits_{j=1}^\frac{M}{d} ij[gcd(i,j) == 1] \\ & = \sum\limits_{d=1}^N d\sum\limits_{i=1}^\frac{N}{d} \sum\limits_{j=1}^\frac{M}{d} ij \sum\limits_{p \mid gcd(i,j)} \mu(p) \\ & = \sum\limits_{d=1}^N d \sum\limits_{p=1}^\frac{N}{d} p^2 \mu(p) \sum\limits_{i=1}^\frac{N}{dp} \sum\limits_{j=1}^\frac{M}{dp} ij \\ & = \sum\limits_{T=1}^N (\sum\limits_{i=1}^\frac{N}{T}\sum\limits_{j=1}^\frac{M}{T} ij) \sum\limits_{p | T} p^2 \times \frac{T}{p} \times \mu(p) \end{align*}\)
推到這裏開始做
首先\(\sum\limits_{i=1}^\frac{N}{T} \sum\limits_{j=1}^\frac{M}{T} ij = \frac{\frac{N}{T}(\frac{N}{T} + 1) \times \frac{M}{T}(\frac{M}{T} + 1)}{4}\),可以數論分塊,那麽要算\(\sum\limits_{p | T} p^2 \times \frac{T}{p} \times \mu(p) = T \sum\limits_{p|T} p \mu(p)\)的前綴和
首先\(\sum\limits_{p|T} p \mu(p) = (id · \mu) * I\)
設\(f(i) = \sum\limits_{p | i} p \mu (p)\),首先\(f(1) = 1 , f(p)(p \in Prime) = (1-p) \)。現在假設已計算出了\(f(i)\),要計算\(f(i \times j)\),其中\(j \in Prime\)。
若\(i = j^k \times x(k,x \geq 1 \&\& x \not\mid j)\),那麽相比於\(i\),\(i \times j\)
否則,對於\(i\)的一個因數\(x(\mu(x) \neq 0)\),在\(i \times j\)中對應兩個因數\(x\)和\(x \times j\),它們會在\(f(i \times j)\)中產生\(x \times j \times (-\mu(x)) + x \times \mu(x) = x \times \mu(x) \times (1 - j)\)的貢獻。
所以\(f(i \times j) = \sum\limits_{p | i}p \mu(p) \times (1 - j) = (1-j)f(i) = f(i)f(j)\)
根據上面的式子線性篩即可。總復雜度\(O(n + t\sqrt{n})\)
#include<bits/stdc++.h>
//This code is written by Itst
using namespace std;
inline int read(){
int a = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c)){
if(c == ‘-‘)
f = 1;
c = getchar();
}
while(isdigit(c)){
a = (a << 3) + (a << 1) + (c ^ ‘0‘);
c = getchar();
}
return f ? -a : a;
}
const int MOD = 20101009 , MAXN = 1e7 + 7;
int prime[MAXN] , xs[MAXN];
bool nprime[MAXN];
int cnt , N , M;
void init(){
xs[1] = 1;
for(int i = 2 ; i <= N ; ++i){
if(!nprime[i]){
prime[++cnt] = i;
xs[i] = MOD - i + 1;
}
for(int j = 1 ; j <= cnt && prime[j] * i <= N ; ++j){
nprime[prime[j] * i] = 1;
if(i % prime[j] == 0){
xs[i * prime[j]] = xs[i];
break;
}
xs[i * prime[j]] = 1ll * xs[i] * xs[prime[j]] % MOD;
}
}
for(int i = 1 ; i <= N ; ++i)
xs[i] = (1ll * xs[i] * i + xs[i - 1]) % MOD;
}
int main(){
N = read();
M = read();
if(N > M)
swap(N , M);
init();
int sum = 0;
for(int i = 1 , pi ; i <= N ; i = pi + 1){
pi = min(N / (N / i) , M / (M / i));
sum = (sum + (xs[pi] - xs[i - 1] + MOD) % MOD * (1ll * (N / i) * (N / i + 1) / 2 % MOD) % MOD * (1ll * (M / i) * (M / i + 1) / 2 % MOD)) % MOD;
}
cout << sum;
return 0;
}
BZOJ2154/BZOJ2693/Luogu1829 Crash的數字表格/JZPFAR 莫比烏斯反演