log2

线性筛--如何线性求约数个数

无人久伴 提交于 2019-12-01 09:26:48
线性筛--如何线性求约数个数 线性筛1654948748 我已经掌握埃氏筛了 为什么还要学线性筛??? 线性筛的时间复杂度是严格 O ( N ) O(N) 的, 而埃氏筛的复杂度是 O ( N ∗ l o g 2 ( l o g 2 ( N ) ) O(N∗log2(log2(N)) 看上去并没有快多少 实际也是 , 但在处理一些大数据时,差距就凸显出来了 算法思路 概述: 和埃氏筛类似的 线性筛是通过枚举到的当前数字乘以某个比该数的最小质因子还小的质数来筛的 (上面这句话有点长, 需要反复理解 暂时不能理解,也没关系,等下代码中我会详细讲的 ) 这样就可以保证每次几乎不会出现重筛的情况,大大减少了循环次数 代码: #include<bits/stdc++.h> using namespace std; #define re register #define ll long long #define in inline #define get getchar() int read() { int t=0; char ch=get; while(ch<'0' || ch>'9') ch=get; while(ch<='9' && ch>='0') t=t*10+ch-'0',ch=get; return t; } const int _=1e7+6; int prime[_],

信息论_熵

血红的双手。 提交于 2019-11-29 19:35:18
信息论主要是对信号所含信息的多少进行量化,其基本思想是一个不太可能发生的事情要比一个可能发生的事情提供更多的信息。 度量信息的集中常用指标有信息熵、条件熵、互信息、交叉熵。 信息熵 信息熵(entropy)简称熵,是对随机变量不确定性的度量。定义为: H(x)=∑p i *log 2 (p i ) 用以下代码来实现对0-1分布变量概率与其信息熵的关系: import matplotlib.pyplot as plt # %matplotlib inline 只有Jupyter需要加这一行,其余常用editor都无需此行代码 p = np.arange(0, 1.05, 0.05) HX = [] for i in p: if i == 0 or i == 1: HX.append(0) else: HX.append(-i * np.log2(i) - (1 - i) * np.log2(1 - i)) plt.plot(p, HX, label='entropy') plt.xlabel('P') plt.ylabel('H(x)') plt.show() 其中p是一个一维数组,其值范围为[0,1.05),步长为0.05,HX是一个列表,用于记录一维数组每个数据的熵值。 得到结果如下: 可见,当概率为0或1时,H(x)= 0 ;当 p = 0.5 时,随机变量的不确定性最大

RMQ问题(超详细!!!)

放肆的年华 提交于 2019-11-26 20:50:18
一、简介 RMQ 是询问某个区间内的最大值或最小值,暴力解法对每个询问区间用循环找最值,当n、q>10000会TLE。 常用RMQ的求解方法—— ST算法 。 ST算法通常用在要多次询问一些区间的最值的问题中。它可以做到O(nlogn)的预处理,O(1)回答每个询问。 使用ST算法的条件是无修改,因此它适用于没有修改并且询问次数较多(10^6级别甚至更大)的情况。 优点:代码短,效率高,实现简单 缺点:适用性差 二、ST算法流程 预处理: ST算法的原理实际上是动态规划,我们用a[1...n]表示一组数。设f[i, j]表示从a[i]到a[i + 2j - 1]这个范围内的最大值,也就是以a[i]为起点连续2j个数的最大值。由于元素个数为2j个,所以从中间平均分成两部分,每一部分的元素个数刚好为2j-1个,也就是说,把f[i,j]分为f[i, j-1]和f[i + 2j-1, j-1],如下图: 举个栗子吧——如下图所示 整个区间的最大值一定是左右两部分最大值的较大值,满足动态规划的最优化原理,分析得到状态转移方程: f[i][j] = max(f[i][j - 1], f[i + 2j-1][j - 1]) ,边界条件为 f[i][0] = a[i] ,这样就可以在O(nlogn)的时间复杂度内预处理f数组。 for(int j=1;j<=LN;j++)   for(int i