f(x)f(x)f(x)表示xxx的次大约数,有f(x)=xx的最小质因数f(x)=\frac{x}{x的最小质因数}f(x)=x的最小质因数x,那么
∑i=1n∑j=1nsgcd(i,j)k=∑i=1n∑j=1nf(gcd(i,j))k=∑d=1nf(d)k∑i=1n∑j=1n[gcd(i,j)=d]=∑d=1nf(d)k∑i=1⌊nd⌋∑j=1⌊nd⌋[gcd(i,j)=1]=∑d=1nf(d)k⋅(2∑i=1⌊nd⌋φ(i)−1)\begin{aligned} \sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}sgcd(i,j)^k&=\sum\limits_{i=1}^n\sum\limits_{j=1}^{n}f(gcd(i,j))^k\\ &=\sum\limits_{d=1}^{n}f(d)^k\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}[gcd(i,j)=d]\\ &=\sum\limits_{d=1}^{n}f(d)^k\sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}\sum\limits_{j=1}^{\lfloor \frac{n}{d}\rfloor}[gcd(i,j)=1]\\ &=\sum\limits_{d=1}^{n}f(d)^k\cdot(2\sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}\varphi(i)-1) \end{aligned}i=1∑nj=1∑nsgcd(i,j)k=i=1∑nj=1∑nf(gcd(i,j))k=d=1∑nf(d)ki=1∑nj=1∑n[gcd(i,j)=d]=d=1∑nf(d)ki=1∑⌊dn⌋j=1∑⌊dn⌋[gcd(i,j)=1]=d=1∑nf(d)k⋅(2i=1∑⌊dn⌋φ(i)−1)
(倒数第二步到最后一步是直接由ϕϕϕ的定义得到的)
2∑i=1⌊nd⌋φ(i)−12\sum\limits_{i=1}^{\lfloor \frac{n}{d}\rfloor}\varphi(i)-12i=1∑⌊dn⌋φ(i)−1是经典的杜教筛求欧拉函数前缀和,
然后因为iii的上界是⌊nd⌋\lfloor\frac{n}{d}\rfloor⌊dn⌋所以求出前缀和以后分块搞一波就好了
∑d=1nf(d)k\sum\limits_{d=1}^{n}f(d)^kd=1∑nf(d)k的求法则非常神仙(%%%网上的大佬):
∑d=1nf(d)k\sum\limits_{d=1}^{n}f(d)^kd=1∑nf(d)k
=∑d=2nf(d)k[d是质数]+∑d=2nf(d)k[d是合数]+f(1)k=\sum\limits_{d=2}^{n}f(d)^k[d是质数]+\sum\limits_{d=2}^{n}f(d)^k[d是合数]+f(1)^k=d=2∑nf(d)k[d是质数]+d=2∑nf(d)k[d是合数]+f(1)k
=∑d=2n[d是质数]+∑d=2n(dd的最小质因数)k[d是合数]=\sum\limits_{d=2}^{n}[d是质数]+\sum\limits_{d=2}^{n}(\frac{d}{d的最小质因数})^k[d是合数]=d=2∑n[d是质数]+d=2∑n(d的最小质因数d)k[d是合数]
∑d=2n[d是质数]\sum\limits_{d=2}^{n}[d是质数]d=2∑n[d是质数]即为nnn以内质数个数,可以用min_25筛出来,接下来只需考虑ddd是合数的部分
回忆min_25筛,
设g(n,j)=∑i=1nik[i∈Pori的最小质因数>Pj]g(n,j)=\sum_{i=1}^ni^k[i\in P\ \ or \ \ i的最小质因数>P_j ]g(n,j)=∑i=1nik[i∈P or i的最小质因数>Pj],则
当Pj2≤nP_j^2\leq nPj2≤n时,
g(n,j)=g(n,j−1)−∑[i的最小质因数=Pj]ikg(n,j)=g(n,j-1)-\sum[i的最小质因数=P_j]i^kg(n,j)=g(n,j−1)−∑[i的最小质因数=Pj]ik
=g(n,j−1)−Pjk∑[i的最小质因数=Pj](iPj)k=g(n,j-1)-P_j^k\sum[i的最小质因数=P_j](\frac{i}{P_j})^k=g(n,j−1)−Pjk∑[i的最小质因数=Pj](Pji)k
=g(n,j−1)−Pjk∑l=Pj⌊nPj⌋[l的最小质因数>Pj−1]lk=g(n,j-1)-P_j^k\sum_{l=P_j}^{\lfloor\frac{n}{P_j}\rfloor}[l的最小质因数>P_{j-1}]l^k=g(n,j−1)−Pjk∑l=Pj⌊Pjn⌋[l的最小质因数>Pj−1]lk
=g(n,j−1)−Pjk[g(⌊nPj⌋,j−1)−g(Pj−1,j−1)]=g(n,j-1)-P_j^k[g(\lfloor\frac{n}{P_j}\rfloor,j-1)-g(P_j-1,j-1)]=g(n,j−1)−Pjk[g(⌊Pjn⌋,j−1)−g(Pj−1,j−1)]
我们发现g(⌊nPj⌋,j−1)−g(Pj−1,j−1)g(\lfloor\frac{n}{P_j}\rfloor,j-1)-g(P_j-1,j-1)g(⌊Pjn⌋,j−1)−g(Pj−1,j−1)
即为∑i=1n[i的最小质因数=Pj](iPj)k\sum_{i=1}^{n}[i的最小质因数=P_j](\frac{i}{P_j})^k∑i=1n[i的最小质因数=Pj](Pji)k
所以∑j=1∣P∣g(⌊nPj⌋,j−1)−g(Pj−1,j−1)\sum_{j=1}^{|P|}g(\lfloor\frac{n}{P_j}\rfloor,j-1)-g(P_j-1,j-1)∑j=1∣P∣g(⌊Pjn⌋,j−1)−g(Pj−1,j−1)
=∑j=1∣P∣∑i=1n[i的最小质因数=Pj](iPj)k=\sum_{j=1}^{|P|}\sum_{i=1}^{n}[i的最小质因数=P_j](\frac{i}{P_j})^k=∑j=1∣P∣∑i=1n[i的最小质因数=Pj](Pji)k
=∑i=2n(ii的最小质因数)k=\sum_{i=2}^{n}(\frac{i}{i的最小质因数})^k=∑i=2n(i的最小质因数i)k
最后,算g(n,0)g(n,0)g(n,0)要快速求∑i=1nik\sum_{i=1}^{n}i^k∑i=1nik,这里要用第二类斯特林数处理一下:
∑i=1nik\sum_{i=1}^{n}i^k∑i=1nik
=∑i=1n∑j=1k{jk}ij‾=\sum_{i=1}^{n}\sum_{j=1}^{k}\{_j^k\}i^{\underline{j}}=∑i=1n∑j=1k{jk}ij
=∑j=1k{jk}∑i=1nij‾=\sum_{j=1}^{k}\{_j^k\}\sum_{i=1}^{n}i^{\underline j}=∑j=1k{jk}∑i=1nij
=∑j=1k{jk}(n+1)j+1‾j+1=\sum_{j=1}^{k}\{_j^k\}\frac{(n+1)^{\underline{j+1}}}{j+1}=∑j=1k{jk}j+1(n+1)j+1
实现细节:
1、取模的话可以自然溢出,unsignedintunsigned\ intunsigned int了解一下ovo
2、求下降阶乘幂的时候,因为这题的模数不是质数,所以不能快乐求逆元,但是因为kkk比较小所以直接暴力一波,一个一个数乘,这堆数中必定有一个是j+1j+1j+1的倍数,所以可以直接先除再乘就好了,注意判断的时候每次都取模判断的话会愉快T掉,所以应该在一开始的时候先把余数算出来,然后根据余数的加法定理直接判就好了
参考博客:https://www.cnblogs.com/yoyoball/p/9204846.html