最近在搞积性函数筛法之类的东西,选了几道有意思的题放在这里。
有公式恐惧症的勿看!
哗啦啦。编程
一句话题意:求\(\sum_{i=1}^n p_{smax}(i)\),\(n\leq 10^{11}\)
其中\(p_{smax(i)}\)表示某个数的次大质因子,定义质数和\(1\)的\(p_{smax}=0\)。数组
min_25筛的简单应用。
先在第一步的时候把质数个数\(g(n,|P|)\)给筛出来,而后进第二步。
第二步时,若当前在状态\(S(n,j)\),强制当前层选的质因子为最大质因子,而后用\(p_{j-1}\)贡献答案。
注意特判最大质因子和次大质因子相同的状况。
结合上述思路,容易写出转移方程:
\(S(n,j) = p_{j-1}(\ g(n,|P|)-(j-1)\ ) + \sum_{k=j}^{|P|} \sum_{e=1}^{p_{k}^{e+1}\leq n} (S(\lfloor \frac{n}{p_k^e} \rfloor ,k+1) + p_k)\)。函数
一句话题意:线性筛出 \(G(T) = \sum_{d|T}\mu(\frac{T}{d}) f(d)\) ,\(T\leq 10^7\)。
其中\(f(d)\)定义为\(d\)惟一分解后的最大指数幂,如\(f(2^33^55^4) = 5,f(17^43^{18})=18\)。spa
这个题是真的有意思。
考虑惟一分解:\(T=p_1^{c_1}p_2^{c_2}...p_k^{c_k}\),\(d=p_1^{b_1}p_2^{b_2}...p_k^{b_k}\)。
显然\(\mu(\frac{T}{d})=0\)的项没有贡献,因此有贡献的项必定知足\(c_i-b_i\leq 1\) 。
若存在\(c_i < c_j\),则\(b_i \leq b_j\) 。
此时\(f(d)\)的取值与\(b_i\)的取值无关,而\(c_i-b_i=0\)或\(1\)时在\(\mu(\frac{T}{d})\)中的贡献刚好相反。
因此这种状况下存在对称性,即\(\sum_{d|T} \mu(\frac{T}{d}) f(d) = 0\) 。
若\(c_1=c_2=...c_k=c\),若存在\(b_i<b_j\),则相似上面的对称性,贡献会为\(0\)。
惟一不存在对称性的状况是\(b_1=b_2=...b_k=c-1\),此时\(f(d)\)相比其反面少\(1\)。
故此时\(\sum_{d|T} \mu(\frac{T}{d}) f(d) = (-1)^{k+1}\)。
因此线性筛的同时记录最大指数幂\(g\),经过判断\(g[\frac{i}{low(i)}]\) 与 \(g[low(i)p_j]\) 是否相同进行转移。递归
两句话题意:给定一张\(n\times n\)的表格,每一个位置有一个值\(f(a,b)\),知足:
对于正整数\(a,b\),有\(f(a,b)=f(b,a)\)且\(bf(a,a+b)=(a+b)f(a,b)\)。
初始\(f(a,b)=ab\)。如今有\(m\)次操做\((a,b,x,k)\),
每次操做你须要将\(f(a,b)\)改成\(x\),并修改整个表格使得表格合法,
在修改完后,你须要输出前\(k\)行前\(k\)列表格中的数字之和,数据范围\(n\leq 10^6,m\leq 10^4\)。数学
首先把条件化为\(\frac{f(a,b)}{ab} = \frac{f(a,a+b)}{a+b}\)。
这能够看做一个类欧过程,故\(\frac{f(a,a\%b)}{a(a\%b)} = \frac{f(a,b)}{ab}\),展开后有\(\frac{f(a,b)}{ab} = \frac{f(d,d)}{d^2},d=gcd(a,b)\)
答案为\(Ans = \sum_{a=1}^K\sum_{b=1}^K f(a,b)\)。
带入上面的展开式后稍微化简一下有:\(Ans = \sum_{d=1}^K f(d,d) G(\lfloor \frac{K}{d} \rfloor)\)。
其中\(G(n) = \sum_{i=1}^n \sum_{j=1}^n [gcd(i,j)=1]ij\),而后这题误导性最强的地方就在这里。
正常想法确定是反演,然而若是去反演那就完蛋了到死也作不出来,正确姿式应该是:
\(G(n) = \sum_{i=1}^n i \sum_{j=1}^n [gcd(i,j)=1]j = 1+2\sum_{i=2}^n i(\frac{\varphi(i)}{2}i) = \sum_{i=1}^n i^2 \varphi(i)\) 。
最后的问题在于维护\(f(d,d)\)的前缀和,要求可以\(O(\sqrt{n})\)修改,\(O(1)\)回答。分块就好了。io
一句话题意:求\(\sum_{i=1}^n \sum_{j=1}^n sgcd(i,j)^k\),\(n\leq 10^9 , k\leq 50\)。
其中\(sgcd(i,j)\)表示\(i\)和\(j\)的次小公因数。class
其实这题还蛮简单的,毕竟太套路了,没啥思惟含量......
显然\(sgcd(i,j) = \frac{gcd(i,j)}{p_{min}(gcd(i,j))}\)。
因此枚举\(gcd(i,j)=d\),
列出式子后能够获得:\(Ans = \sum_{d=1}^{n} (\frac{d}{p_{min}(d)})^k \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\sum_{j=1}^{\lfloor \frac{n}{d} \rfloor} [gcd(i,j)=1]\)
而后用对称性稍微弄一下就能够获得:
\[Ans = \sum_{d=1}^{n} (\frac{d}{p_{min}(d)})^k(2 \sum_{i=1}^{\lfloor \frac{n}{d} \rfloor}\varphi(i)-1)\]
爽!用min_25筛预先解决\(\sum_{i=1}^d(\frac{i}{p_{min}(i)})^k\),而后对于\(\sum_{i=1}^n \varphi(i)\)直接杜教筛便可。循环
一句话题意:\(T\)次询问\(\sum_{i=1}^n \sum_{j=1}^m \varphi(ij)\)。\(n,m\leq 10^5\) ; \(T\leq 10^4\)。构造函数
常见套路先把\(\varphi(ij)\)写开能够获得:\(Ans = \sum_{d=1}^n \frac{d}{\varphi(d)} \sum_{i=1}^n \sum_{j=1}^n \varphi(i) \varphi(j) [gcd(i,j)=d]\)。
不要把\(gcd=d\)变为\(gcd=1\),而是直接莫比乌斯反演能够获得:
\[Ans = \sum_{i=1}^n (\sum_{d|i} \frac{d}{\varphi(d)} \mu(\frac{i}{d})) G(\lfloor \frac{n}{i} \rfloor , i) G(\lfloor \frac{m}{i} \rfloor)\]
其中\(G(n , K) = \sum_{i=1}^n \varphi(iK)\) 。
前面的一坨\(F(i) = \sum_{d|i} \frac{d}{\varphi(d)} \mu(\frac{i}{d})\)显然是个迪利克雷卷积,线性筛出来就好了。
关于\(G\)如何求,妙哉妙哉!注意到\(iK\leq n\),因此暴力全算出来就好了,复杂度调和级数。
而后\(Ans = \sum_{i=1}^n F(i) G(\lfloor \frac{n}{i} \rfloor ,i) G(\lfloor \frac{m}{i} \rfloor ,i)\),如何快速求答案?
又是妙哉妙哉,咱们设\(H(U,n,m) = \sum_{i=1}^n F(i) G(n,i) G(m,i)\)。
而后咱们设置一个阀值\(B\),将\(n,m\leq B\)的\(H\)所有预先算出来存到一个数组里去。
咱们用预处理好\(H\)加上数论分块算好全部\(n,m\leq B\)的答案。
对于\(n,m > B\) 的部分,由于有\(\frac{n}{i}> B\),因此\(i\leq \lfloor \frac{n}{B} \rfloor\)不会很大,这部分直接暴力算。
那么此时复杂度变为了\(O(B^2n + T(\sqrt{n} + \lfloor \frac{n}{B} \rfloor ))\),\(B\)取\(T^{\frac{1}{3}}\)左右便可获得可行的复杂度。
一句话题意: 求\(K\)进制下,\(\sum_{x=1}^n \sum_{y=1}^m [\)\(\frac{x}{y}\)为纯循环小数\(]\)。\(n,m\leq 10^9\),\(K\leq 2000\)。
小学"奥术"学过纯循环小数的处理:存在\(t\),使得\(\frac{K^tx-x}{y} = k\)。
因此\(K^tx = ky + x\)。因此\(K^t \% y = 1\)。
因此\(Ans = \sum_{x=1}^n \sum_{y=1}^m [x \perp y][K\perp y]\),下面一题多解:
为了节省篇幅,设\(f_s(n)=\sum_{i=1}^n [i\perp K] = \lfloor \frac{n}{K} \rfloor \varphi(K) + brute(n \%K)\)
解1:(暴力拆\([x\perp y]\))
\(Ans = \sum_{x=1}^n \sum_{y=1}^n [K\perp y] \sum_{d|gcd(x,y)} \mu(d)\)
$Ans = \sum_{d=1}^n \mu(d) \sum_{x=1}^{\lfloor \frac{n}{d} \rfloor } \sum_{y=1}^{\lfloor \frac{m}{d} \rfloor} [K \perp yd] $
$Ans = \sum_{d=1}^n \mu(d)[K\perp d] \sum_{x=1}^{\lfloor \frac{n}{d} \rfloor } \sum_{y=1}^{\lfloor \frac{m}{d} \rfloor} [K \perp y] = \sum_{d=1}^n \mu(d) [K \perp d] \lfloor \frac{n}{d} \rfloor f_s(\lfloor \frac{m}{d} \rfloor) $
\(f(n,K) = \sum_{d=1}^n \mu(d)[K\perp d] = \sum_{d=1}^n \mu(d) \sum_{s|K,s|d}\mu(s)\)
\(f(n,K) = \sum_{s|K} \mu(s) \sum_{i=1}^{\lfloor \frac{n}{s} \rfloor} \mu(si) = \sum_{s|K} \mu(s)^2 \sum_{i=1}^{\lfloor \frac{n}{s} \rfloor} f(\lfloor \frac{n}{s} \rfloor , s)\)
递归处理便可,终态\(f(n,1)\)直接杜教筛。
QaQ一下,duang~~~
解2:(暴力拆\([K\perp y]\))
\(g(n,m,K) = \sum_{x=1}^n \sum_{y=1}^m [x\perp y] \sum_{d|K,d|y} \mu(d)\)
\(g(n,m,K) = \sum_{d|K} \mu(d) \sum_{x=1}^n \sum_{i=1}^{\lfloor \frac{m}{d} \rfloor} [x\perp id]\)
\(g(n,m,K) = \sum_{d|K} \mu(d) \sum_{i=1}^{\lfloor \frac{m}{d} \rfloor} \sum_{x=1}^n [x\perp i] [x\perp d] = \sum_{d|K} \mu(d) g(\lfloor \frac{m}{d}\rfloor ,n,d)\)
递归处理便可,终态\(g(n,m,1)\)直接数论分块+杜教筛处理。
QwQ一下,duang~~~
解3:(某 高姓一本爷神仙 的作法)
拿着这道题去问\(gzy\)这题怎么算复杂度啊?min_25筛作是否是假的啊?
而后神仙就给了我这个神仙作法,
该作法时间复杂度仅\(O(\sqrt{n} + n^{\frac{2}{3}})\),不管时间复杂度仍是编程复杂度都吊打了一切题解。
回到解法一的中间:求\(\sum_{d=1}^n f(d) = \sum_{d=1}^n \mu(d) [K\perp d]\)。
咱们构造函数\(g(d) = [d\perp K]\),\(f,g\)都积性,故用\(f(d)\)与\(g(d)\)构造迪利克雷卷积。
\(\sum_{i=1}^n h(i) = \sum_{i=1}^n \sum_{d|i} f(d) g(\frac{i}{d}) = \sum_{i=1}^n \sum_{d|i} \mu(d) [K\perp d][K\perp \frac{i}{d}]\)
\(\sum_{i=1}^n h(i) = \sum_{i=1}^n \sum_{d|i} \mu(d) [K \perp i] = \sum_{i=1}^n [K\perp i] \sum_{d|i} \mu(d)\)。
\(\sum_{i=1}^n h(i) = \sum_{i=1}^n [K\perp i][i=1] = \sum_{i=1}^n [i=1]\)。
故\(h(i) = [i=1]\),写完整:\(\sum_{i=1}^n [i=1] = \sum_{i=1}^n \sum_{d|i} \mu(d) [K\perp d][K\perp \frac{i}{d}]\)
因此直接杜教筛便可:\(\sum_{i=1}^n f(i) = 1 - \sum_{i=2}^n [i\perp K]\sum_{j=1}^{\lfloor \frac{n}{i} \rfloor} f(j)\)。 这个解法真的太妙了!这构造真的神了,无论你怎么以为,反正我是当场直接给跪了。