对数

O(log n)究竟意味着什么?

拥有回忆 提交于 2019-12-05 14:06:36
我正在学习Big O Notation运行时间和摊销时间。 我理解 O(n) 线性时间的概念,意味着输入的大小成比例地影响算法的增长...例如,二次时间 O(n 2 )等 也是如此。即使算法也是如此。 ,例如置换生成器,具有 O(n!) 倍,通过阶乘生长。 例如,以下函数是 O(n), 因为算法与其输入 n 成比例增长: f(int n) { int i; for (i = 0; i < n; ++i) printf("%d", i); } 同样,如果有嵌套循环,则时间为O(n 2 )。 但究竟什么是 O(log n) ? 例如,说完整二叉树的高度是 O(log n)是 什么意思? 我知道(可能不是非常详细)什么是对数,在这个意义上:log 10 100 = 2,但我无法理解如何识别具有对数时间的函数。 #1楼 下面的解释是使用完全 平衡的 二叉树的情况来帮助您了解我们如何获得对数时间复杂度。 二叉树是这样一种情况,其中大小为n的问题被分成大小为n / 2的子问题,直到我们达到大小为1的问题: 这就是你得到O(log n)的方法,这是在上面的树上需要完成的工作量才能达到解决方案。 具有O(log n)时间复杂度的通用算法是二进制搜索,其递归关系是T(n / 2)+ O(1),即在树的每个后续级别,您将问题分成一半并且执行恒定量的额外工作。 #2楼 但究竟什么是O(log n)?

求LCM(a,b)=n的(a,b)的总对数(a<=b)

随声附和 提交于 2019-12-05 02:11:35
\(a={p_1} ^ {a_1} *{p_1} ^ {a_1} *..........*{p_n} ^ {a_n}\) \(b={p_1} ^ {b_1} *{p_1} ^ {b_1} *..........*{p_n} ^ {b_n}\) \(lcm(a,b)={p_1} ^ {max(a_1,b_1)} *{p_2} ^ {max(a_2,b_2)} *..........*{p_n} ^ {max(a_n,b_n)}=n\) 假定 \(a<=b\) 所以对n进行质因数分解,计算出每个质因数的指数部分,比如其中一部分 \({p_n}^k\) 则说明 \(max(a_n,b_n)=k\) ,那么如果 \(a_n=k\) ,那么 \(b_n\) 有 \(k+1\) 种取值方法,同理如果 \(b_n=k\) ,那么 \(a_n\) 有 \(k+1\) 种取值方法,那么对于这个质因数我们有 \(2*(k+1)-1\) 种取值方法,一开始 \(ans=1\) ,对于每个质因数乘以其贡献,那么除了 \(a=b=n\) 的情况,其他都计算了两次,由于最后我们要的是 \((a<=b)\) 的方案数,那么 \(ans=ans/2+1\) 即可 来源: https://www.cnblogs.com/graytido/p/11897008.html

CSPS_103

99封情书 提交于 2019-12-03 22:31:16
    被sdfz踩爆了!     %%%kai586123     %%%Gekoo     %%%sdfz_yrt          T1        我以为是水题!一直在肝!        而且为什么每次我的考场暴力都是考后才调出来啊!!       先记录一下正解的大神做法:         按顺序考虑每次出牌,每次要出使总胜数不变的最大的牌         考虑将a和b的牌放在一起排序,那么这个问题变成了:括号匹配         那么考虑对于一个左括号,每次找一个最靠右的右括号与他匹配(或不匹配),还使得总对数不变         如果找到的右括号在它右边,那么如果找到的当前位置i的右括号导致对数减少,找到更右的位置i+k一定也导致对数减少         这点可以直观理解,因为i位置导致对数减少,说明左侧的左括号找不到任何替代的右括号,也说明右侧没有任何“空闲”的括号         所以出牌的大小对对数的影响有可二分性,问题变成了如何快速维护剩余对数       Rockstar_B:线段树维护分治         考虑在值域线段树上维护对数,给每个节点维护2个变量sum[2]和pair表示这个值域区间里“空闲”左括号和右括号的数量和匹配数         修改后递归回来维护:        int now=min(sum[lch][0],sum[rch][1])

计算a^b==a+b在(l,r)的对数Codeforces Round #597 (Div. 2)

久未见 提交于 2019-12-03 21:11:37
题: https://codeforces.com/contest/1245/problem/F 分析:转化为:求区间内满足a&b==0的对数(解释见代码) ///求满足a&b==0在区间【l,r】的对数 ///推导:区间[2l,2r]可由[l,r]乘3倍得来 ///原因:*2我们可以看成事左移1位,那么这个位置上,对于俩个数来说 /////////可以取0,1 或1,0或0,0才依然满足 a&b==0这个题目条件 /////////这个公式可以用递归推导回溯计算, /////////当我们回递归到区间为奇数的情况的时候,我们想办法让它变成偶数 /////////假设[a,b]中a是奇数,那么我们就把它弄成a+1,然后加上漏算的部分即可 /////////g(x,y)表示在区间[0,b]中和x满足题目条件的个数 /////////然后漏算的部分就是 (g(a,b)-g(a,a))*2 /////////b为奇数的情况也照样这样分析 /////////完 #include<bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back ll g(int a,int b){ ll ans=0; ll num=0; for(int i=1;i<=b;i<<=1){ if(i&b){ b^=i;

codeforces597 div2 F 数位dp

荒凉一梦 提交于 2019-12-03 11:51:49
codeforces597 div2 F 数位dp 题意: 求[L,R]中a&b==0的“对数” 思路: 一个典型的求“对数”的数位dp,对比普通的数位dp,共用一个pos,维护两个limit。剩下的就是“暴搜”了,当然注意去重,因为是求对数就不是简单的 \(ans_{R}-ans_{L-1}\) 了。还有要注意lim的状态也要保存,不然会超时。 代码: #include <bits/stdc++.h> using namespace std; #define X first #define Y second #define PB push_back #define LL long long #define pii pair<int,int> #define MEM(x,y) memset(x,y,sizeof(x)) #define bug(x) cout<<"debug "#x" is "<<x<<endl; #define FIO ios::sync_with_stdio(false); #define ALL(x) x.begin(),x.end() #define LOG 20 const int inf =1e9; const int maxn =3e5+7; const int mod = 1e9+7; LL dp[35][2][2]; LL solve(int L

归并排序(逆序对数)

匿名 (未验证) 提交于 2019-12-03 00:43:02
ll qans; // 记录答案 int date[maxn]; // 数据数组 int tarray[maxn]; // 归并排序的中间数组 // POJ - 2299 SGU - 180 void merge( int arr[], int left, int right, int tarr[]) { if (left>=right) return ; int m = (left+right) >> 1 ; merge(arr, left, m, tarr); merge(arr, m + 1 , right, tarr); int i,j, cnt; i = left; j = m+ 1 ; cnt = 0 ; while (i<=m && j<= right) { if (arr[i] <= arr[j]) tarr[cnt ++] = arr[i++ ]; else { qans += (ll)m - i + 1 ; // 求逆序对. tarr[cnt++] = arr[j++ ]; } } while (i<=m) tarr[cnt++] = arr[i++ ]; while (j<=right) tarr[cnt++] = arr[j++ ]; for (i= 0 ; i<cnt; ++i) arr[left++] = tarr[i]; } View Code 原文

离散对数――大步小步算法(BSGS)

匿名 (未验证) 提交于 2019-12-03 00:34:01
已知 a , b , P a , b , P ,且a与P互质,求解同余方程 a x ≡ b ( m o d P ) a x ≡ b ( m o d P ) 设 m = P √ m = P 设 x = i m + j x = i m + j ,即 i = x m i = x m , j = x m o d m j = x m o d m 所以满足 i ≤ m i ≤ m , j ≤ m j ≤ m 得 a i m + j ≡ b ( m o d P ) a i m + j ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j ≡ a i m b ( m o d P ) a j ≡ a i m b ( m o d P ) 先枚举j,将得到的 a j a j 存入hash表; 再枚举i,计算 a i m b a i m b ,是否存在hash表中,如果有,则找到了解,输出即可。 为保证答案最小,必须保证先枚举j,再枚举i,且保证 a j a j 在hash表中j从小到大排列 long long work( long long a, long long b, long long P) { long long m,v,e= 1 ,i; m=ceil(sqrt(P+ 0.5 )); v=pow_mod(a

离散对数――大步小步算法(BSGS)

匿名 (未验证) 提交于 2019-12-03 00:34:01
已知 a , b , P a , b , P ,且a与P互质,求解同余方程 a x ≡ b ( m o d P ) a x ≡ b ( m o d P ) 设 m = P √ m = P 设 x = i m + j x = i m + j ,即 i = x m i = x m , j = x m o d m j = x m o d m 所以满足 i ≤ m i ≤ m , j ≤ m j ≤ m 得 a i m + j ≡ b ( m o d P ) a i m + j ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j a i m ≡ b ( m o d P ) a j ≡ a i m b ( m o d P ) a j ≡ a i m b ( m o d P ) 先枚举j,将得到的 a j a j 存入hash表; 再枚举i,计算 a i m b a i m b ,是否存在hash表中,如果有,则找到了解,输出即可。 为保证答案最小,必须保证先枚举j,再枚举i,且保证 a j a j 在hash表中j从小到大排列 long long work( long long a, long long b, long long P) { long long m,v,e= 1 ,i; m=ceil(sqrt(P+ 0.5 )); v=pow_mod(a

[信号]回波损耗(Return Loss)

匿名 (未验证) 提交于 2019-12-02 23:47:01
  回波损耗是传输线端口的反射波功率与入射波功率之比,以对数形式的绝对值来表示,单位是dB,一般是正值。 反射系数(r)为反射波电压与入射波电压的比值取对数,而回波损耗(rL)为反射功率与入射功率之比。取对数运算时,可以推到出两者的相互关系如下: rL=20|lg(r)| 例如:当r=0.1时可以得到回拨损耗为20dB;即反射功率为入射功率的1%。