首页 > 其他分享 >[学习笔记]Dirichlet

[学习笔记]Dirichlet

时间:2023-08-12 09:04:04浏览次数:30  
标签:Dirichlet limits int 质数 笔记 学习 枚举 sum

Dirichlet学习笔记

Dirichlet前缀和

狄利克雷前缀和是求解形如

\[b_k=\sum\limits_{i|k}a_i \]

的式子

首先我们可以想到枚举 \(i\) ,再枚举 \(i\) 的倍数 \(j\) $$b_j=b_j+a_i$$

此时的时间复杂度为 \(n/1+n/2+n/3+...+n/1\) 。由于调和级数,时间复杂度为 \(O(nlogn)\)

进一步分析式子,我们可以发现一个较大的 \(b_k\) 可以分解为几个 \(b_{k的因子}\) 相加,例如 \(b_8=a_1+a_2+a_3+a_4+a_8\) ,\(b_4=a_1+a_2+a_3+a_4\) , 所以 \(b_8=b_4+a_8\)

而 \(8=2*4\) ,我们可以考虑枚举质数因子,和质数的系数来求解。

例如

for(int i=1;i<=tot;i++){
    for(int j=1;p[i]*j<=n;j++){
        a[p[i]*j] += a[j];
    }
}

\(p[i]\) 为枚举的质数,\(j\)为质数的系数,我们把 \(b\) 数组放到 \(a\) 数组中,节省空间更方便

Dirichlet后缀和

后缀和和前缀和基本相同,只改变了赋值方向。

\[b_k=\sum\limits_{k|i}a_i \]

for(int i=1;i<=tot;i++){
    for(int j=n/p[i];j>=1;j--){
        a[j] += a[p[i]*j];
    }
}

倒Dirichlet前缀和

\[a_k=\sum\limits_{i|k}b_i \]

给出 \(a_k\) 求 \(b_i\)。我们需要从大到小枚举

for(int i=tot;i>=1;i--){
    for(int j=n/p[i];j>=1;j--){
        a[p[i]*j] -= a[j];
    }
}

倒Dirichlet后缀和

\[a_k=\sum\limits_{k|i}b_i \]

for(int i=tot;i>=1;i--){
    for(int j=1;p[i]*j<=n;j++){
        a[j] -= a[p[i]*j];
    }
}

标签:Dirichlet,limits,int,质数,笔记,学习,枚举,sum
From: https://www.cnblogs.com/muzqingt/p/17624279.html

相关文章

  • 【刷题笔记】17. Letter Combinations of a Phone Number
    题目Givenastringcontainingdigitsfrom 2-9 inclusive,returnallpossiblelettercombinationsthatthenumbercouldrepresent.Amappingofdigittoletters(justlikeonthetelephonebuttons)isgivenbelow.Notethat1doesnotmaptoanyletters.Ex......
  • C语言小白,下面是一些笔记,大神勿入!
    ~ --按位取反,在二进制中,原来的1变为0,0变为1,得到补码原码:直接按照正负写出的二进制序列反码:原码的符号位不变,其他位按位取反得到补码:反码加一得到inta=0;intb=~a;//b是有符号的整形,其二进位最左边一个数为0为正数,为1是负数printf("%d\n",b);//打印的是这个数的原码inta=10;int......
  • MySQL数据库笔记(二)
    聚集函数聚集函数:SQL提供的方法统计函数count(字段):统计表中记录的个数.语法: selectcount(*)from表名; 练习: --统计exam中有多少个学生: selectcount(name)fromtb_exam; selectcount(id)fromtb_exam; selectcount(*)fromtb_exam;--根据任意字段进行统计......
  • 【THM】tmux(tmux使用入门)-学习
    本文相关的TryHackMe实验房间链接:https://tryhackme.com/room/rptmux本文相关内容:学习使用tmux,它是linux系统中最强大的多任务处理工具之一。tmux简介和实践终端多路复用器tmux是Linux社区中最常用的工具之一。虽然tmux不是一个恶意工具,但是它能让攻击者在整个渗透测试过程中......
  • 今日学习HDFS相关内容
    1、Shell命令行解释说明HDFS简介HDFS应用场景HDFS集群架构HDFS的Shell命令行客户端使用该命令即可进入到Shell命令行客户端;HDFS的文件系统协议具体用法如下:第一个查看的文件并不在hdfs文件系统的根目录下面;第二个查看的是hdfs文件系统的根目录;这个命令有时还可以......
  • [刷题笔记] Luogu P1725 琪露诺
    ProblemDescription若当前在\(pos\)位置,每次可以在\([pos+l,pos+r]\)区间内任选一个点跳。每跳到一个地方就可以获得这个地方的值,最后跳到位置\(pos\geqn\)即为结束,求如何跳才能使结束的时候获得的值最大?Analysis我们发现所有操作都是在一条链上完成的,显然若再次跳到这个位......
  • 数据人同城交友之旅,交流探讨倾听学习
    作为数据人,我们渴望结识志同道合的伙伴!但忙碌的生活让我们错过了交流的机会。让时间慢下来,深入了解彼此,收获更多美好的想象。用热情和智慧点燃城市的火花,打造属于我们的数据圈子。期待与你相遇,开启难忘的数据之旅!为什么要加入数据人同城交友群同城活动我们在活动中付出真诚与智慧,......
  • 「学习笔记」圆方树
    圆方树最初是处理「仙人掌图」(每条边在不超过一个简单环中的无向图)的一种工具,不过发掘它的更多性质,有时我们可以在一般无向图上使用它。个人觉得,圆方树是一个很好的工具。圆方树的题目更多的侧重于想,而不是怎么建圆方树。前置知识——点双连通分量点双连通分量:不存在割点的图。......
  • 与点对有关的CDQ分治(菜鸟笔记)
    参考文章   首先要说明的是CDQ是一种思想,并且扩展范围很广。   这里主要说的是与点对有关的CDQ。参考文章说了与CDQ主要解决的三大类问题。第一类就是解决和点对有关的问题。主要是给定一个长度为n的序列,然后找出其中满足题意的点对\((i,j)\)。   CDQ的......
  • 七月学习之Firewalld基本介绍
    1、Firewalld基本介绍1.1、什么是Firewalld在CentOS7系统中集成了多款防火墙管理工具,默认启动的是firewalld(动态防火墙管理器)Firewalld支持CLI及GUI的两种管理方式对于接触linux较早的人员对iptables比较的熟悉由于iptables的规则比较麻烦,并且网络有一定要求,所以学习成本较高......