初赛(3)
进制转换
首先考虑十进制:
\(1629=1*1000+6*100+2*10+9*1\)
进一步的
\(1629=1*10^3+6*10^2+2*10^1+9*10^0\)
于是我们给出进制概念
一个k进制的正数,是其每一位乘以k的对应次方之和。相当于给每一位赋予不同的权重
各种进制只是对数的不同描述,运算规律在各种进制下不变。
技巧
其他进制 转 十进制:乘幂,再加法
十进制 转 其他技巧:短除法
二进制运算
& 按位与 都为真,则为1,否则为0
| 按位或 都为假,则为0,否则为1
^ 按位异或 相同为0,不同为1
~ 按位取反
<< 左移,最右边补0
>> 右移,标准没有最左边补什么
实践上,unsigned直接补0,signed复制原先最高位
【小插曲】
逻辑运算,&&优先级高于||
a&&b||c&&d=(a&&b)||(c&&d)
补码
补码是这样一套体系:
\([0,2^{31}-1]\)这\(2^{31}\)个非负数,直接存储二进制
\([-2^{31},-1]\)这\(2^{31}\)个负数,存储其相应的正数的\(加法逆元^①\)
①加法逆元:\(x\)和\(inv(x)\)加在一起,变成\(0\)
\(-x\)的补码表示(~x)+1(这个符号是取反)
好处:
易运算。计算\(a-b\)值需要计算\(a+(-b)\)
只有一个\(0\)
非常容易获取一个数的相反数
主定理
假设有递推关系式\(T(n)=aT(\)\(n \over b\)\()\)\(+f(n)\),其中\(n\)为问题规模,\(a\)为递推的子问题数量,\(n \over b\)为每个子问题的规模(假设每个子问题的规模基本一样),\(f(n)\)为递推以外进行的计算工作
\(a≥1,b≥1\)为常数,\(f(n)\)为函数,\(T(n)\)为非负整数,刻有以下结果(分类讨论):
(1)若\(f(n)=O(n^{{log_b}^{a-c}})\),\(c>0\),那么\(T(n)=\Theta(n^{{log_b}^a})\)
(2)若\(f(n)=\Theta(n^{{log_b}^{a}})\),那么\(T(n)=\Theta(n^{{log_b}^a}logn)\)
(3)若\(f(n)=\Omega(n^{{log_b}^{a-c}})\),\(c>0\),且对于某个常数\(c<1\)和所有充分大的\(n\)有\(af(\)\(n \over b\)\()≤cf(n)\),那么\(T(n)=\Theta(f(n))\)
常用结论
\(T(n)=2T(\)\(n \over 2\)\()+\Theta(n)=\Theta(n\ log\ n)\)
\(T(N)=T(\)\(n \over 2\)\()+\Theta(n)=\Theta(n)\)
\(T(n)=T(\)\(n \over 2\)\()+\Theta(1)=\Theta(log\ n)\)
\(T(n)=2T(\)\(n \over 2\)\()+\Theta(n\sqrt{n})=\Theta(n\sqrt{n})\)
计数原理
排列数\(A_n^m\):在\(n\)个人里面选出\(m\)个人排队(有序)
组合数\(C_n^m\):在\(n\)个人里面选出\(m\)个人(无序)
组合数通项:\(C_n^m=\frac{A_n^m}{A_m^m}\)
另外还有:\(C_n^x=C_n^{n-x}\)
\(Pascal公式\):\(C_n^m=C_{n-1}^{m-1}+C_{n-1}^m\)

浙公网安备 33010602011771号