天蝎座的周末
令结果为 xx=log2+log3+...+log9 +90+log1.1+log1.2+...+log9.9 +1800+log1.01+log1.02+...+log9.99 +3 =∫logx dx (从2到10) +90+10∫logx dx(从1.1到9.9) +1800+ 100∫logx dx (从1.01到9.99) +3 = ...后两次积分上限的不同是考虑到修正
x=(∫log(x)dx(2--1001)+∫log(x)dx(1--1000))/2 =((x*log(x)-∫xdlog(x))(2--1001)+(x*log(x)-∫xdlog(x))(1---1000))/2 =2567.857000.....
length(N)10=floor[lg(N)+1] =floor[lg(1*2*3*...*999*1000)+1] =floor[lg1+lg2+lg3+...+lg999+lg1000+1] =floor[lg2+lg3+...lg999+lg1000+1] <= lg1=0
∑(N=2..1000)lgN = ∫lgxdx (x=2..1000)
∫lgxdx (x=2..1000) = (1/ln10)*∫lnxdx (x=2..1000)
= (1/ln10)*[x*lnx - ∫xd(lnx)] (x=2..1000)
= (1/ln10)*[x*lnx - ∫dx] (x=2..1000)
= (1/ln10)*[x*lnx - x] (x=2..1000)
= x*(lnx - 1)/ln10 (x=2..1000)
∫lgxdx (x=2..1000) = 1000*(ln1000 - 1)/ln10 - 2*(ln2 - 1)/ln10
= [1000*(6.907755279 - 1) - 2*(0.693147181 - 1)]/ln10
= [1000* 5.907755279 - 2*(-0.306852819)]/2.302585093
= [5907.755279 - (- 0.613705639)]/2.302585093
= 5908.368984639/2.302585093
= 2565.97204707
length(N)10 = floor[2565.97204707 + 1] = 2566
∫lgxdx (x=2..1000) = 1000*(ln1000 - 1)/ln10 - 1*(ln1 - 1)/ln10
= [1000*( 6.907755279 - 1) - 1*(0 - 1)]/ln10
= [1000*5.907755279 - 1*(-1)]/2.302585093 = [5907.755279 + 1]/2.302585093
= 5908.755279/2.302585093
= 2566.13981258
length(N)10 = floor[2566.13981258 + 1] = 2567
1. 设定 tab 的位置
:set tabstop=4
2. 输入 tab 时自动将其转化为空格
:set expandtab
如果此时需要输入真正的 tab,则输入 Ctrl+V, tab,在 Windows 下是 Ctrl+Q, tab
3. 将已存在的 tab 都转化为空格
:retab
4. 设定编辑模式下 tab 的视在宽度
:set softtabstop
这不改变 tabstop,但让编辑的时候 tab 看起来是指定的宽度,输入 tab 时会插入的 tab 和空格的混合,比如 tabstop=4,softtabstop=10,那么插入 tab 时会将光标移动 10 个字符,可能会是两个 tab 加两个空格,这对 backspace 也有效。
5. 解决 shiftwidth 和 tabstop 不等时的麻烦
:set smarttab
在行首输入 tab 时插入宽度为 shiftwidth 的空白,在其他地方按 tabstop 和 softtabstop 处理
6. 将 tab 显示为可见字符
:set list listchars=tab:>-
tab 将被显示为 >—- 的形式
7. 只在编辑特定类型的文件时展开 tab
将如下代码加入 ~/.vimrc
autocmd FileType * set tabstop=4|set shiftwidth=4|set noexpandtab autocmd FileType python set tabstop=4|set shiftwidth=4|set expandtab
参考文章:
前几天同学提到编程实现排列组合的算法, 要能把排列组合的结果输出. 想了一段时间未果, 同学的思路是使用递归, 比如求解找出 n 个数中 m 个数的排列和组合:
step a) 求解后 n-1 个数中 m 个数的排列组合; // P(n-1, m) 或 C(n-1, m)
step b) 求解后 n-1 个数中 m-1 个数的排列组合; // P(n-1, m-1) 或 C(n-1, m-1)
基本情况: m 为 0 时返回.
整个过程复杂度 O(n^2), 空间需要 P(n, m)*m 或者 C(n, m)*m.
下面是从网上找到的排列组合算法, 我觉得挺巧的, 最后面是一个利用 C++ STL 库函数实现的排列组合算法 (与前面的无关), 复杂度未知 (应该取决于库函数的内部实现吧).
1.1 组合算法
本程序的思路是开一个数组,其下标表示 1 到 m 个数,数组元素的值为 1 表示其下标代表的数被选中,为 0 则没选中。
首先初始化,将数组前 n 个元素置 1,表示第一个组合为前 n 个数。
然后从左到右扫描数组元素值的“10”组合,找到第一个“10”组合后将其变为“01”组合,同时将其左边的所有“1”全部移动到数组的最左端。
当第一个“1”移动到数组的 m-n 的位置,即 n 个“1”全部移动到最右端时,就得到了最后一个组合。
例如求 5 中选 3 的组合: 1 1 1 0 0 //1,2,3 1 1 0 1 0 //1,2,4 1 0 1 1 0 //1,3,4 0 1 1 1 0 //2,3,4 1 1 0 0 1 //1,2,5 1 0 1 0 1 //1,3,5 0 1 1 0 1 //2,3,5 1 0 0 1 1 //1,4,5 0 1 0 1 1 //2,4,5 0 0 1 1 1 //3,4,5
1.2 全排列算法
从 1 到 N,输出全排列,共 N! 条。
分析:用 N 进制的方法吧。设一个 N 个单元的数组,对第一个单元做加一操作,满 N 进一。每加一次一就判断一下各位数组单元有无重复,有则再转回去做加一操作,没有则说明得到了一个排列方案。
2 C++ STL 的排列组合方法实现: 最近一直在看 << C++ 标准程序库 >> 这本书,在看到"变序性算法"部分的时候,发现两个函数 next_permutation, prev_permutation 对于我们平时处理排列组合的问题很有帮助,根据书上的介绍写了两个个测试函数: