定义 f ( n ) = ∑ d ∣ n ∣ μ ( d ) ∣ f(n)=\sum_{d \mid n}|\mu(d)| f(n)=∑d∣n∣μ(d)∣,给定 n , m n,m n,m 求 ∑ i = 1 m f ( n i ) \sum_{i=1}^mf(ni) ∑i=1mf(ni),结果对 1 e 9 + 7 1e9+7 1e9+7 取模。
易得 f ( n ) = 2 w ( n ) f(n)=2^{w(n)} f(n)=2w(n), w ( n ) w(n) w(n) 为 n n n 本质不同的质因子个数(显然积性函数,当 gcd ( a , b ) = 1 \gcd(a,b)=1 gcd(a,b)=1 ,则有 f ( a b ) = f ( a ) ∗ f ( b ) f(ab)=f(a)*f(b) f(ab)=f(a)∗f(b) )。因为可以看做是 n n n 的质因子任意组合对 f ( n ) f(n) f(n) 产生贡献。即 C w ( n ) 1 + C w ( n ) 2 + . . . + C w ( n ) w ( n ) C_{w(n)}^1+C_{w(n)}^2+...+C_{w(n)}^{w(n)} Cw(n)1+Cw(n)2+...+Cw(n)w(n),特别的 1 1 1 也产生贡献。也就是 1 + C w ( n ) 1 + C w ( n ) 2 + . . . + C w ( n ) w ( n ) = 2 w ( n ) 1+C_{w(n)}^1+C_{w(n)}^2+...+C_{w(n)}^{w(n)}=2^{w(n)} 1+Cw(n)1+Cw(n)2+...+Cw(n)w(n)=2w(n)。
再有 f ( n i ) = 2 w ( n ) ∗ 2 w ( i ) 2 w ( gcd ( n , i ) ) f(ni)=\frac{2^{w(n)}*2^{w(i)}}{2^{w(\gcd(n,i))}} f(ni)=2w(gcd(n,i))2w(n)∗2w(i), w ( n ) w(n) w(n) 为本质不同的质因子个数,而 w ( n ) w(n) w(n) 和 w ( i ) w(i) w(i) 中重复计算了质因子,所以要去掉一份相同的部分。
F ( n ) = ∑ i = 1 m f ( n i ) = ∑ i = 1 m f ( n ) ∗ f ( i ) f ( gcd ( n , i ) ) = ∑ d ∣ n ∑ i = 1 m f ( n ) ∗ f ( i ) f ( gcd ( n , i ) ) [ gcd ( n , i ) = d ] = f ( n ) ∑ d ∣ n 1 f ( d ) ∑ i = 1 m f ( i ) [ gcd ( n , i ) = d ] = f ( n ) ∑ d ∣ n 1 f ( d ) ∑ i = 1 ⌊ m d ⌋ f ( i d ) [ gcd ( n d , i ) = 1 ] = f ( n ) ∑ d ∣ n 1 f ( d ) ∑ i = 1 ⌊ m d ⌋ f ( i d ) ∑ t ∣ n d , t ∣ i μ ( t ) = f ( n ) ∑ d ∣ n 1 f ( d ) ∑ t ∣ n d μ ( t ) ∑ i = 1 ⌊ m t d ⌋ f ( i t d ) = f ( n ) ∑ T ∣ n ∑ d ∣ T μ ( T d ) f ( d ) ∑ i = 1 ⌊ m T ⌋ f ( i T ) ( T = t d ) = f ( n ) ∑ T ∣ n g ( T ) ∑ i = 1 ⌊ m T ⌋ f ( i T ) ( g ( T ) = ∑ d ∣ T μ ( T d ) f ( d ) ) \begin{aligned}F(n)&=\sum_{i=1}^mf(ni)\\ &=\sum_{i=1}^m\frac{f(n)*f(i)}{f(\gcd(n,i))}\\ &=\sum_{d\mid n} \sum_{i=1}^m\frac{f(n)*f(i)}{f(\gcd(n,i))}[\gcd(n,i)=d] \\ & =f(n)\sum_{d\mid n} \frac{1}{f(d)} \sum_{i=1}^mf(i)[\gcd(n,i)=d]\\ & =f(n) \sum_{d\mid n} \frac{1}{f(d)} \sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}f(id)[\gcd(\frac{n}{d},i)=1] \\&= f(n)\sum_{d\mid n} \frac{1}{f(d)} \sum_{i=1}^{\left\lfloor\frac{m}{d}\right\rfloor}f(id)\sum_{t\mid\frac{n}{d}\ ,\ t\mid i}\mu(t) \\ &= f(n)\sum_{d\mid n} \frac{1}{f(d)}\sum_{t\mid\frac{n}{d}}\mu(t) \sum_{i=1}^{\left\lfloor\frac{m}{td}\right\rfloor}f(itd)\\ &= f(n)\sum_{T\mid n}\sum_{d\mid T} \frac{\mu(\frac{T}{d})}{f(d)} \sum_{i=1}^{\left\lfloor\frac{m}{T}\right\rfloor}f(iT) \ \ \ \ \ \ \ \ \ \ \ \ \ \ (T=td) \\ &=f(n)\sum_{T\mid n} g(T) \sum_{i=1}^{\left\lfloor\frac{m}{T}\right\rfloor}f(iT) \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ (g(T)=\sum_{d\mid T} \frac{\mu(\frac{T}{d})}{f(d)})\end{aligned} F(n)=i=1∑mf(ni)=i=1∑mf(gcd(n,i))f(n)∗f(i)=d∣n∑i=1∑mf(gcd(n,i))f(n)∗f(i)[gcd(n,i)=d]=f(n)d∣n∑f(d)1i=1∑mf(i)[gcd(n,i)=d]=f(n)d∣n∑f(d)1i=1∑⌊dm⌋f(id)[gcd(dn,i)=1]=f(n)d∣n∑f(d)1i=1∑⌊dm⌋f(id)t∣dn , t∣i∑μ(t)=f(n)d∣n∑f(d)1t∣dn∑μ(t)i=1∑⌊tdm⌋f(itd)=f(n)T∣n∑d∣T∑f(d)μ(dT)i=1∑⌊Tm⌋f(iT) (T=td)=f(n)T∣n∑g(T)i=1∑⌊Tm⌋f(iT) (g(T)=d∣T∑f(d)μ(dT))
根据数论函数 ( f ∗ g ) ( n ) = ∑ d ∣ n f ( d ) g ( n d ) (f*g)(n)=\sum_{d\mid n}f(d)g(\frac{n}{d}) (f∗g)(n)=∑d∣nf(d)g(dn),则有 ∑ d ∣ T μ ( T d ) f ( d ) = ( 1 f ∗ μ ) ( T ) \sum_{d\mid T} \frac{\mu(\frac{T}{d})}{f(d)}=(\frac{1}{f}*\mu)(T) ∑d∣Tf(d)μ(dT)=(f1∗μ)(T),二者都是积性函数,结合二者的特性,于是我们可以得到对应公式:其中, T T T 为若干本质不相同的质因子的乘积。
g ( T ) = { 1 , i f T = 1 ( − 1 ) w ( T ) ∗ 1 2 w ( T ) , i f T = ∑ i = 1 w ( T ) P i 0 , o t h e r s g(T)=\begin{cases}1,&if\ T=1\\(-1)^{w(T)}*\frac{1}{2}^{w(T)}, &if \ T=\sum_{i=1}^{w(T)}P_i \\ 0, &others\end{cases} g(T)=⎩⎪⎨⎪⎧1,(−1)w(T)∗21w(T),0,if T=1if T=∑i=1w(T)Piothers
我们能预处理的部分: f ( n ) , g ( T ) f(n),g(T) f(n),g(T)。后面这块 ∑ i = 1 ⌊ m T ⌋ f ( i T ) \sum_{i=1}^{\left\lfloor\frac{m}{T}\right\rfloor}f(iT) ∑i=1⌊Tm⌋f(iT) 太大只能离线处理,上面说到 g ( T ) g(T) g(T) 的性质,当 T T T 不是本质不相同的质因子的乘积时, g ( T ) = 0 g(T)=0 g(T)=0,所以我们只需要找出 n n n 的所有本质不相同的质因子的任意组合(最多八个因子 2 ∗ 3 ∗ 5 ∗ 7 ∗ 11 ∗ 13 ∗ 17 ∗ 19 = 9 , 699 , 690 2*3*5*7*11*13*17*19=9,699,690 2∗3∗5∗7∗11∗13∗17∗19=9,699,690,所以组合也就 2 8 = 256 2^8=256 28=256 个,对比枚举 n n n 的所有因子 n \sqrt{n} n 显然要快),以该因子 d d d 作为第一关键字, m m m 作为第二关键字,排序。
最后就是这个离线操作的精髓操作,排序好的待操作数,以 m m m 的大小递增,则后继的 d d d 相同的数的计算,可以用到之前留下的历史信息,也就节约了 ∑ i = 1 ⌊ m T ⌋ f ( i T ) \sum_{i=1}^{\left\lfloor\frac{m}{T}\right\rfloor}f(iT) ∑i=1⌊Tm⌋f(iT) 的空间。
做完这个题说实话对于莫比乌斯函数的理解又多了点,数论函数若有类似莫比乌斯函数结构的,同样也可以通过类似的计算得到答案。
代码如下:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long LL;
const int maxn = 1e7 + 5;
const LL mod = 1e9 + 7;
LL inv2 = (mod + 1)/2;
int cnt, qtol;
int f[maxn], g[maxn], judge[maxn], prime[maxn], ans[maxn], fn[maxn];
int fact[31], bin[31];
struct node{
int d, m, id;
bool operator < (const node &a) const{
return d == a.d ? m < a.m : d < a.d;
}
}q[maxn];
inline void init(){
bin[0] = f[1] = g[1] = 1;
for(int i = 1; i <= 30; i++) bin[i] = bin[i - 1] << 1;
for(int i = 2; i < maxn; i++){
if(!judge[i]){
prime[judge[i] = ++cnt] = i;
f[i] = 2;
g[i] = mod - inv2;
}
for(int j = 1, v; j <= judge[i] && (v = i*prime[j]) < maxn; j++){
judge[v] = j;
if(j != judge[i]){
f[v] = (LL)2*f[i]%mod; // *2
g[v] = (LL)g[prime[j]]*g[i]%mod; // *(1/2)
}else
f[v] = f[i]; // is not a new prime fact, g[v] = 0;
}
}
}
int main(){
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
init();
int t, n, m, size, s;
cin >> t;
for(int id = 1; id <= t; id++){
cin >> n >> m;
fn[id] = f[n];
size = 0;
for(int d = 2; d*d <= n; d++){
if(!(n%d)){
fact[size++] = d;
while(!(n%d))
n /= d;
}
}
if(n != 1) fact[size++] = n;
for(int i = 0; i < bin[size]; i++){
int d = 1;
for(int j = 0; j < size; j++)
if((1 << j)&i)
d *= fact[j];
if(m < d || !g[d]) continue;
q[qtol++] = node{d, m, id};
}
}
sort(q, q + qtol);
int d = 0, now, sum;
for(int i = 0; i < qtol; i++){
if(d != q[i].d){
d = q[i].d;
now = d;
sum = 0;
}
for(; now <= q[i].m; now += d)
sum = (sum + f[now])%mod;
ans[q[i].id] = (ans[q[i].id] + (LL)g[d]*sum)%mod;
}
for(int i = 1; i <= t; i++)
cout << (LL)fn[i]*ans[i]%mod << endl;
}