这题其实是个六合一(
不仅代码写得精神污染,这篇题解写得更加精神污染……
以下分析复杂度时设 A,B,C 同阶,并以 n 代替。
以及 CYJ 题解中对于 type=2 的枚举 gcd(i,j) 的推导好像有点问题,不过也许是我太菜了(
所以这里直接枚举 gcd(i,j,k)。
第一步: A∏i=1B∏j=1C∏k=1(lcm(i,j)gcd(i,k))f(type)=A∏i=1B∏j=1C∏k=1(ijgcd(i,j)gcd(i,k))f(type)
所以?
所以分别算 A∏i=1B∏j=1C∏k=1if(type),A∏i=1B∏j=1C∏k=1gcd(i,j)f(type)
于是这就成了个六合一(
type = 0
A∏i=1B∏j=1C∏k=1i=(A!)BC
A∏i=1B∏j=1C∏k=1gcd(i,j)=A∏i=1B∏j=1gcdC(i,j)=min(A,B)∏d=1⌊Ad⌋∏i=1⌊Bd⌋∏j=1d[gcd(i,j)=1]C=min(A,B)∏d=1dC⌊Ad⌋∑i=1⌊Bd⌋∑j=1[gcd(i,j)=1]=min(A,B)∏d=1dCmin(⌊Ad⌋,⌊Bd⌋)∑k=1μ(k)⌊Adk⌋⌊Bdk⌋=min(A,B)∏T=1∏d|Tdμ(Td)⌊AT⌋⌊BT⌋C=min(A,B)∏T=1(∏d|Tdμ(Td))⌊AT⌋⌊BT⌋C
O(nlogn) 预处理 ∏d|Tdμ(Td) 的前缀积和前缀积的逆,然后单次询问 O(√nlogn)。
type = 1
A∏i=1B∏j=1C∏k=1iijk=(A∏i=1ii)BC(B+1)(C+1)/4
A∏i=1B∏j=1C∏k=1gcdijk(i,j)=(A∏i=1B∏j=1gcdij(i,j))C(C+1)/2=(min(A,B)∏d=1⌊Ad⌋∏i=1⌊Bd⌋∏j=1d[gcd(i,j)=1]d2ij)C(C+1)/2=(min(A,B)∏d=1dd2⌊Ad⌋∑i=1⌊Bd⌋∑j=1[gcd(i,j)=1]ij)C(C+1)/2=(min(A,B)∏d=1dd2min(⌊Ad⌋,⌊Bd⌋)∑k=1μ(k)k2⌊Adk⌋⌊Bdk⌋(⌊Adk⌋+1)(⌊Bdk⌋+1)/4)C(C+1)/2=(min(A,B)∏T=1(∏d|Tdμ(Td))T2⌊AT⌋⌊BT⌋(⌊AT⌋+1)(⌊BT⌋+1)/4)C(C+1)/2
O(nlogn) 预处理 (∏d|Tdμ(Td))T2 的前缀积和前缀积的逆,然后单词询问 O(√nlogn)。
type = 2
A∏i=1B∏j=1C∏k=1igcd(i,j,k)=min(A,B,C)∏d=1⌊Ad⌋∏i=1(id)d⌊Bd⌋∑j=1⌊Bd⌋∑k=1[gcd(i,j,k)=1]=min(A,B,C)∏d=1⌊Ad⌋∏t=1⌊Atd⌋∏i=1(itd)μ(t)d⌊Btd⌋⌊Ctd⌋=min(A,B,C)∏T=1∏d|T(⌊AT⌋!T⌊AT⌋)μ(Td)d⌊BT⌋⌊CT⌋=min(A,B,C)∏T=1(⌊AT⌋!T⌊AT⌋)φ(T)⌊BT⌋⌊CT⌋
预处理一下 Tφ(T) 的前缀积即可。
A∏i=1B∏j=1C∏k=1gcd(i,j)gcd(i,j,k)=min(A,B,C)∏d=1⌊Ad⌋∏i=1⌊Bd⌋∏j=1(dgcd(i,j))d⌊Cd⌋∑k=1[gcd(i,j,k)=1]=min(A,B,C)∏d=1min(⌊Ad⌋,⌊Bd⌋,⌊Cd⌋)∏t=1⌊Atd⌋∏i=1⌊Btd⌋∏j=1(tdgcd(i,j))μ(t)d⌊Ctd⌋
把底数拆出来,看 td 的部分:
min(A,B,C)∏d=1min(⌊Ad⌋,⌊Bd⌋,⌊Cd⌋)∏t=1⌊Atd⌋∏i=1⌊Btd⌋∏j=1(td)μ(t)d⌊Ctd⌋=min(A,B,C)∏d=1min(⌊Ad⌋,⌊Bd⌋,⌊Cd⌋)∏t=1(td)μ(t)d⌊Atd⌋⌊Btd⌋⌊Ctd⌋=min(A,B,C)∏T=1T⌊AT⌋⌊BT⌋⌊CT⌋φ(T)
是否有一种似曾相识的感觉?
看看上面那个 igcd(i,j,k) 的式子,发现可以约分掉这部分。
于是乎那个式子只要求 min(A,B,C)∏T=1(⌊AT⌋!)φ(T)⌊BT⌋⌊CT⌋
而这个式子要求 min(A,B,C)∏d=1min(⌊Ad⌋,⌊Bd⌋,⌊Cd⌋)∏t=1⌊Atd⌋∏i=1⌊Btd⌋∏j=1gcdμ(t)d⌊Ctd⌋(i,j)=min(A,B,C)∏d=1min(⌊Ad⌋,⌊Bd⌋,⌊Cd⌋)∏t=1min(⌊Atd⌋,⌊Btd⌋,⌊Ctd⌋)∏k=1min(⌊Atdk⌋,⌊Btdk⌋,⌊Ctdk⌋)∏l=1(kl)μ(t)μ(l)d⌊Ctd⌋⌊Atdkl⌋⌊Btdkl⌋=min(A,B,C)∏T=1min(⌊AT⌋,⌊BT⌋,⌊CT⌋)∏K=1∏d|Kdμ(Kd)⌊ATK⌋⌊BTK⌋φ(T)⌊CT⌋
然后两只数论分块加上 O(nlogn) 预处理出前缀积和前缀积的逆就可以单次询问 O(n3/4logn) 了。
(在洛谷要开 O2 才能过,不过常数确实还有优化空间)
代码:
1 |
|