首页 > 其他分享 >Dirichlet 前缀和学习笔记

Dirichlet 前缀和学习笔记

时间:2023-08-26 16:22:14浏览次数:50  
标签:Dirichlet 前缀 ll 笔记 times k2 k1 seed 我们

传送门

求\(b_k=\sum\limits_{i|k}{a_i}\)

考虑\(i=p_1^k,j=p_1^{k+1}\),若我们已经求出了\(b_i\),则易知\(b_j=b_i+a_j\)

然后根据上面的方法,考虑对于所有的\(k=p_1^{k1}p_2^{k2}...p_l^{kl}\),若\(j=p_2^{k2}...p_l^{kl}\),我们已经求出所有的\(c_k=a_j+a_{p1\times j}+a_{p1^2\times j}+...+a_{p1^{k1}\times j}\)

则对于\(i=p_1^{k1},j=p_1^{k1}p_2\),若我们求出了\(c_i,c_j\),则\(b_j=c_i+c_j\)

进一步的,对于\(i=p_1^{k1}p_2,j=p_1^{k1}p_2^2\),若我们求出了\(b_i\),则\(b_j=b_i+c_j\)

再进一步,对于\(i=p_1^{k1}p_2^{k2},j=p_1^{k1}p_2^{k2+1}\),若我们求出了\(b_i\),则\(b_j=b_i+c_j=\sum\limits_{t=0}^{k2+1}c_{p_1^{k1}p_2^t}\)

我们发现,若我们重复上述步骤,则对于任意数\(k=p_1^{k1}p_2^{k2}...p_l^{kl}\),我们都可以求出\(b_k\)

那么如何快速求出\(c_i\)呢?

我们可以先令\(c_i=a_i\)

当我们枚举出一个质数\(p_i\)时,我们可以枚举\(j=1\)~\(n\),然后令\(c_{j\times p_i}+=c_j\)即可

然后我们又发现,不需要这么多个数组,只需要一个数组滚动更新即可

上代码:

#include<bits/stdc++.h>
#define ll unsigned int
using namespace std;
const ll N=2e7+15;
ll n,seed;
ll b[N],ans;
bool np[N];
ll getnext()
{
	seed^=seed<<13;
	seed^=seed>>17;
	seed^=seed<<5;
	return seed;
}
int main()
{
	scanf("%u %u",&n,&seed);
	for(ll i=1;i<=n;i++) b[i]=getnext();
	np[1]=1;
	for(ll i=1;i<=n;i++)
	{
		if(!np[i])
		for(ll j=1;i*j<=n;j++)
		b[i*j]+=b[j],np[i*j]=1;
		ans^=b[i];
	}
	printf("%u\n",ans);
	return 0;
}

标签:Dirichlet,前缀,ll,笔记,times,k2,k1,seed,我们
From: https://www.cnblogs.com/pengchujie/p/17658968.html

相关文章

  • 回文自动机(PAM)学习笔记
    传送门我认为理解回文自动机需要图,以\(abbaabba\)为例,它的回文树是这样的:令树上的每一个点为一个回文串,其中,\(1\)为根的树中的点回文串长度为奇数,且最中间的那个字母就是\(1\)连向其他点的的边的字母,而\(0\)为根的树中的点回文串长度为偶数。举点例子吧:点\(2\)的回文串为\(a\)......
  • c语言笔记6
    c语言笔记6(结构体,共用体,枚举,文件操作,makefile)1.结构体1.1结构体的概念结构体也是构造类型之一,由至少一个基本数据类型或构造类型组成的一种数据结构(集合),这种数据结构称之为结构体1.2结构体的定义使用结构体之前,先定义结构体,然后使用这个结构体时作为一种数据类型(......
  • 欧拉定理学习笔记
    欧拉定理:若\(gcd(a,m)=1\),则\(a^{\varphi(m)}\equiv1\pmod{m}\)证明:令\(r_1,r_2,···,r_{\varphi(m)}\)为模m下的一个简化剩余系,则\(ar_1,ar_2,···,ar_{\varphi(m)}\)也为模m下的一个简化剩余系,令\(f=r_1*r_2*···*r_{\varphi(m)}\),则有:\(f\equivar_1*ar_2*···*ar_{......
  • 杜教筛学习笔记
    杜教筛学习笔记闲话感觉以前根本没学懂杜教筛,于是重学了一遍,写个笔记记录一下。前置知识依赖于迪利克雷卷积、莫比乌斯反演、整除分块相关知识。记号约定及基本性质约定:\(f*g\)表示\(f\)与\(g\)的迪利克雷卷积,即\((f*g)(n)=\sum\limits_{ij=n}f(i)g(j)\)。\(f\cdot......
  • Linux设备驱动开发详解——学习笔记
    Linux设备驱动概述计算机系统的运转需要软件和硬件共同参与,硬件是底层基础,软件则实现了具体的应用。硬件和软件之间则通过设备驱动来联系。在没有操作系统的情况下,工程师可以根据硬件设备的特点自行定义接口。而在有操作系统的情况下,驱动的架构则由相应的操作系统来定义。驱动存......
  • Mybatis学习笔记
    一、Mybatis简介二、下载与实现1)下载 官网下载2)实现①创建项目工程,并加入依赖②创建核心configuration.xml配置文件,配置JDBC的连接信息③创建POJO对象④创建POJO对应的mapper映射文件⑤在configuration.xml文件中加载mapper文件⑥测试三、接口实现方式(项目中常用)①创建一个接口②......
  • 运筹学习笔记之列生成
    列生成算法介绍1.什么是列生成列生成算法是一种用于解决大规模线性规划问题的高效算法,它基于单纯形法的思想,通过求解子问题来找到可以进基的非基变量。在列生成算法中,每个变量都代表一列,因此称为列生成算法。该算法的优点在于其高效的计算性能和较好的收敛性,适用于处理大规模、......
  • openGauss学习笔记-51 openGauss 高级特性-列存储
    openGauss学习笔记-51openGauss高级特性-列存储openGauss支持行列混合存储。行存储是指将表按行存储到硬盘分区上,列存储是指将表按列存储到硬盘分区上。行、列存储模型各有优劣,建议根据实际情况选择。通常openGauss用于OLTP(联机事务处理)场景的数据库,默认使用行存储,仅对执行复杂......
  • csapp学习笔记——第二章信息的表示和处理
    csapp学习笔记——第二章信息的表示和处理本章主要讲了计算机系统中的数据的表示方法以及在为什么会出现相关的转化问题(floatintdouble等互相转换)。计算机系统中的数字表示方法在现实世界中我们使用的是十进制的表示方法,而在计算机系统中我们则使用的是2进制的表示方法(构造储......
  • 线段树+动态开点权值线段树+主席树学习笔记
    线段树一般用于维护符合结合律的信息。可以用于求区间最大值区间和区间最小值最大子段和甚至于最大负数最小正数之类的信息。事实上线段树只有你想不到,很少有做不到的,算是相当常用的数据结构。下面将结合个人理解和具体题目来讲一讲线段树。[https://www.luogu.com.cn/proble......