取排列组合数,翻出来的以前垃圾代码
使用方法?plzhnum(10,5,100,1) &&输出从10(第一个参数)个中取5(第二个参数)个的全排列的第100(第三个参数)位排列?plzhnum(10,5,100,0) &&输出从10(第一个参数)个中取5(第二个参数)个的全组合的第100(第三个参数)位组合
proc plzhnum
lpara n,m,s,p
local z,jg,num,j,i,num0,pl,zh
note plzh(n,m,p),S为plzh(n,m,p)的第S条记录
z=plzh(m.n,m.m,m.p)
jg=''
if EMPTY(m.p)
if m.s<m.z
num=0
j=1
do whil m.num<m.s
i=iif(''=m.jg,1,val(subs(m.jg,rat(',',m.jg)+1))+1)
do whil m.num<s and m.n-m.i>=m.m-m.j
num0=plzh(m.n-m.i,m.m-m.j,0)
num=m.num+m.num0
i=m.i+1
enddo
jg=m.jg+','+ltri(str(m.i-1))
num=iif(m.s<m.num,m.num-m.num0,m.num)
j=m.j+1
enddo
endif
do whil occu(',',m.jg)<m.m
jg=m.jg+','+ltri(str(m.n-m.m+1+occu(',',m.jg)))
enddo
jg=m.jg+','
else
pl=plzh(m.m,m.m,1)
if m.s<m.z
zh=ceil(m.s/m.pl)
num=0
j=1
do whil m.num<m.zh
i=iif(''=m.jg,1,val(subs(m.jg,rat(',',m.jg)+1))+1)
do whil m.num<m.zh and m.n-m.i>=m.m-m.j
num0=plzh(m.n-m.i,m.m-m.j,0)
num=m.num+m.num0
i=m.i+1
enddo
jg=m.jg+','+ltri(str(m.i-1))
num=iif(m.zh<m.num,m.num-m.num0,m.num)
j=m.j+1
enddo
num=mod(m.s-1,m.pl)+1
else
num=m.pl
endif
do whil occu(',',m.jg)<m.m
jg=m.jg+','+ltri(str(m.n-m.m+1+occu(',',m.jg)))
enddo
zh=m.jg+','
jg=','
for m.i=1 to m.m
pl=plzh(m.m-m.i,m.m-m.i,1)
j=subs(m.zh,at(',',m.zh,ceil(m.num/m.pl)))
j=left(m.j,at(',',m.j,2))
zh=stuf(m.zh,at(m.j,m.zh),len(m.j),',')
jg=m.jg+righ(m.j,len(m.j)-1)
num=mod(m.num-1,m.pl)+1
endfor
endif
retu m.jg
proc plzh
lpara n,m,plorzh
local cj,i
cj=1
for i=m.n-m.m+1 to m.n
cj=m.cj*m.i
endfor
if EMPTY(m.plorzh)
for m.i=2 to m.m
cj=m.cj/m.i
endfor
endif
retu m.cj