首页 > 编程语言 >算法学习笔记(28): 筛法

算法学习笔记(28): 筛法

时间:2023-07-26 22:13:26浏览次数:32  
标签:frac 筛法 cdot nd sum 28 mu 算法 id

筛法

线性筛


杜教筛

放在偏序关系 \((\Z, |)\) 中卷积……

如何快速的求 \(S(n) = \sum_{i = 1}^n f(i)\)。

如果能够找到一个函数 \(g\) :

\[\begin{aligned} \sum_{i = 1}^n (f * g)(i) &= \sum_{i = 1}^n \sum_{d | i} f(\frac id) g(d) \\ &= \sum_{d = 1}^{n} g(d) \sum_{i = 1}^{\lfloor \frac nd \rfloor} f(i) \\ &= \sum_{d = 1}^{n} g(d) S(\lfloor \frac nd \rfloor) \\ \end{aligned} \]

那么可以得出:

\[g(1)S(n) = \sum_{i = 1}^n (f * g)(i) - \sum_{d = 2}^n g(d) S(\lfloor \frac nd \rfloor) \]

这样我们就可以通过整除分块快速的求出 \(g(1) S(n)\) 了。

当然,需要有很严苛的前提:

  • \(f * g\) 的前缀和是可以快速求的。

  • \(g\) 的前缀和也是可以快速求的。

  • 这里的快速应该是 \(O(1)\),如果是 \(O(\log n)\) 估计也没关系。


例题

  1. 快速求 \(\sum_{i = 1}^n \sum_{j = 1}^n \varphi(\gcd(i, j))\)

  2. 快速求 \(\sum_{i = 1}^n \sum_{j = 1}^n i \cdot j \cdot gcd(i, j)\)

例二中有一个很好的东西,点乘。

其定义有:\((f \cdot g)(n) = f(n) \cdot g(n)\)。

当 \(h\) 为完全积性函数时,有 \((f \cdot h) * (g \cdot h) = (f * g) \cdot h\)。

这里列出一些基本的组合:

  • \(\mu \cdot id_k\)

    有 \(((\mu \cdot id_k) * id_k)(n) = \sum_{d | n} \mu(d) d^k (\frac nd)^k = n^{k + 1}\sum_{d | n} \mu(d) = \varepsilon(n)\)

  • \(\varphi \cdot id_k\)

    有 \((\varphi \cdot id_k) * id_k = I\),推导同上。


Min25 筛

本质是对线性筛的扩展……

为了方便,声明一些符号:

  • \(P\) 代表质数集合。

  • \(P_i\) 表示第 \(i\) 个质数。

  • \(minp(i)\) 表示 \(i\) 的最小质因数。

还是求 \(\sum_{i = 1}^n f(i)\)。可以用 Min25 筛需要满足一些条件:

  • \(f(i)\) 是一个低阶多项式。

  • \(f(p^k)\) 可以快速的求解。

现在考虑把每一阶分别计算。

标签:frac,筛法,cdot,nd,sum,28,mu,算法,id
From: https://www.cnblogs.com/jeefy/p/17583655.html

相关文章

  • 算法学习笔记(27): 后缀排序
    后缀排序本文做复习用,不宜初学用。开篇膜拜Pecco:算法学习笔记(84):后缀数组-知乎(zhihu.com)有些时候,其实\(O(n\log^2n)\)的排序也挺好。又短又简单。其中\(rk[i]\)表示从第\(i\)个字符开始的后缀的排名,\(sa[i]\)表示排名为\(i\)的后缀开始的位置。#includ......
  • 算法练习-day32
    动态规划62.不同路径题意:一个机器人位于一个mxn 网格的左上角(起始点在下图中标记为“Start”)。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。问总共有多少条不同的路径?实例:思路:本题我们已知机器人只能走右和下两种方向,因此......
  • 代码随想录算法训练营第一天| LeetCode 704. 二分查找、LeetCode 27. 移除元素
    704.二分查找    题目链接:https://leetcode.cn/problems/binary-search/   视频链接:https://www.bilibili.com/video/BV1fA4y1o715     文章讲解:https://programmercarl.com/0704.%E4%BA%8C%E5%88%86%E6%9F%A5%E6%89%BE.html    卡哥的题目建......
  • poj 2886 Who Gets the Most Candies? (线段树单点更新应用)
                           poj2886WhoGetstheMostCandies?DescriptionNchildrenaresittinginacircletoplayagame.Thechildrenarenumberedfrom1toNinclockwiseorder.Eachofthemhasacardwithanon-zerointegeronit......
  • Google tile 和 TMS 的索引算法
    Googletile和TMS的索引算法TMS是tilemapservice的缩写,是一种瓦片地图服务,也称之为WMTS(webmaptileservice),具体的标准可以见OGC网站。TMS的算法很简单,就是把投影后的世界地图按照层级进行四叉树(待验证)切割,切割后的瓦片数量随层级呈金字塔型,数量和层级关系如下表所示: 对......
  • kmp算法的个人理解
    最长前后缀:假设有一段字符串:"aabaa"则这段字符串的前缀有:aaaaabaaba后缀:aaabaaabaa求最长公共前后缀的方法:找到前缀和后缀中相同的字符串:aaa其中最长的字符串为aa则"aabaa"这个字符串的最长公共前后缀为aaaa其长度为2按照以上的方式逐个计算"aabaa"中的每个子字符串得到......
  • 洛谷 P2894 [USACO08FEB] Hotel G 题解
    题目链接P2894[USACO08FEB]HotelG-洛谷|计算机科学教育新生态(luogu.com.cn)分析考虑用线段树维护区间信息维护sum(最大连续空房间数)如何合并?sum1为max(sum2,sum3)(1的两个子区间)但我们发现若区间为100001(0表示空房间)sum1=4而max(sum2,sum3)=2所以再维护suml(从左开始的......
  • 算法刷题笔记--并查集的运用
    1、题目描述:一个城市中有两个犯罪团伙A和B,你需要帮助警察判断任意两起案件是否是同一个犯罪团伙所为,警察所获得的信息是有限的。假设现在有N起案件(N<=100000),编号为1到N,每起案件由团伙A或团伙B所为。你将按时间顺序获得M条信息(M<=100000),这些信息分为两类:D[a][b]其中[a]和[b]表示两......
  • 算法学习--并查集相关知识及例题
    一、并查集的定义二、基本操作1、初始化一开始,每个元素都是独立的集合#include<iostream>usingnamespacestd;constintmaxN=1000;intfather[maxN];intmain(){for(inti=1;i<=maxN;i++){father[i]=i;}return0;}2、查找递推版本://返......
  • 一道简单的算法题
    ///<summary>///字符串str1与str2,若str1中的各个字符经过重排后能形成str2,则返回true。///str1="sawsdfdfalsraodf";///str2="world";///rearrange(str1,str2)->true;//////提示:检查str1中的各个字符的字符数是否大于str2各个字符的字符数即可///</summary>......