[航海协会]求和

Posted StaroForgin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[航海协会]求和相关的知识,希望对你有一定的参考价值。

求和

题目概述


题解

既然是数学题,那我们就先来化化式子。
显然,看到 gcd ⁡ ( i , j ) \\gcd(i,j) gcd(i,j),那我们不妨枚举这个最大公因数是多少,再看看有多少对数它们的 gcd ⁡ \\gcd gcd是这个。
有,
A n s = ∑ d = 1 n ( ∑ i = 1 n ∑ j = 1 n [ g c d ( i , j ) = d ] ) ( ∑ i = 1 K f i ( d ) ) Ans=\\sum_d=1^n(\\sum_i=1^n\\sum_j=1^n [gcd(i,j)=d])(\\sum_i=1^Kf_i(d)) Ans=d=1n(i=1nj=1n[gcd(i,j)=d])(i=1Kfi(d))对于 f i ( x ) f_i(x) fi(x)这一项,显然是当所有质因子的次数都不超过 i i i的时候为 ( − 1 ) d ( x ) (-1)^d(x) (1)d(x),其它时候都为 0 0 0
而这有显然是一个积性函数,我们可以很容易地用筛子筛出来。
所以我们主要考虑的是前面这个 ∑ i = 1 n ∑ j = 1 n [ g c d ( i , j ) = d ] \\sum_i=1^n\\sum_j=1^n[gcd(i,j)=d] i=1nj=1n[gcd(i,j)=d]怎么算。
这主要有两种方法,一种是大家都很熟悉的莫比乌斯反演,直接枚举这个,进行容斥, ∑ d ∣ t μ ( t d ) ⌊ n t ⌋ 2 = ∑ i = 1 ⌊ n d ⌋ μ ( i ) ⌊ ⌊ n d ⌋ i ⌋ \\sum_d|t\\mu(\\fractd)\\lfloor\\fracnt\\rfloor^2=\\sum_i=1^\\lfloor\\fracnd\\rfloor\\mu(i)\\lfloor\\frac\\lfloor\\fracnd\\rfloori\\rfloor dtμ(dt)tn2=i=1dnμ(i)idn
我们定义 h ( x ) = ∑ i = 1 x μ ( i ) ⌊ x i ⌋ 2 h(x)=\\sum_i=1^x\\mu(i)\\lfloor\\fracxi\\rfloor^2 h(x)=i=1xμ(i)ix2,则 A n s = ∑ d = 1 n h ( ⌊ n d ⌋ ) ( ∑ i = 1 K f i ( d ) ) Ans=\\sum_d=1^nh(\\lfloor\\fracnd\\rfloor)(\\sum_i=1^Kf_i(d)) Ans=d=1nh(dn)(i=1Kfi(d))
显然,前面的 h ( x ) h(x) h(x)是可以数论分块 O ( x ) O\\left(\\sqrtx\\right) O(x )计算,后面有可以整除分块按 n d \\fracnd dn计算。
后面的 f i ( d ) f_i(d) fi(d)可以 min ⁡ 25 \\min25 min25筛,按 ⌊ n d ⌋ \\lfloor\\fracnd\\rfloor dn位置计算前缀和,然后我们就得到了一个 O ( n 1 − ϵ ) O\\left(n^1-\\epsilon\\right) O(n1ϵ)的亚线性算法。
然后吗?你就 T T T了。

好的,这也就是说我们得换一种方法计算我们的 h ( ⌊ n d ⌋ ) h(\\lfloor\\fracnd\\rfloor) h(dn),同样的思路,还是计算有多少对在 [ 1 , n d ] [1,\\fracnd] [1,dn]以内的数对互质,这不是可以欧拉函数吗?
显然, h ( x ) = 2 ( ∑ i = 1 x ϕ ( x ) ) − 1 h(x)=2(\\sum_i=1^x\\phi(x))-1 h(x)=2(i=1xϕ(x))1,之间枚举数对内较大一个数是那个不就行了吗,注意减去重复的 ( 1 , 1 ) (1,1) (1,1)
ϕ ( x ) \\phi(x) ϕ(x)不也是积性函数吗?我们这个前缀和可以与我们的 f i ( x ) f_i(x) fi(x)一起计算了。
ϕ ( x ) \\phi(x) ϕ(x)的计算就是经典的 min ⁡ 25 \\min25 min25筛问题了,先计算质数和与质数个数,减去后就得到质数处上的位置,再把其他质因子加回去即可。
至于 f i ( x ) f_i(x) fi(x)的计算,是与 μ ( x ) \\mu(x) μ(x)的计算类似的你,你只需要在意把质数加回去时每个质数的次项不超过 i i i即可。

时间复杂度 O ( K n 3 4 ln ⁡ n ) O\\left(\\fracKn^\\frac34\\ln n\\right) O(lnnKn43)
注意 f f f数组维度的顺序,这会严重地影响常数,就跟矩阵乘法一样。

源码

 #pragma GCC optimize(2)
 #pragma GCC optimize(3)
 #pragma GCC optimize("Ofast")
 #include<bits/stdc++.h>
 using namespace std;
 typedef long long LL;
 typedef pair<int,int> pii;
 typedef unsigned int uint;
 #define MAXN 200005
 #define pb push_back
 #define mkpr make_pair
 [航海协会]万灵药

[航海协会]SSSP

[航海协会]稀疏阶乘问题

[航海协会]身体

[航海协会]身体

[航海协会]数论