主题:出一道送分题
Mato完整版
[专家分:1270] 发布于 2008-04-21 22:00:00
在N个格子里填上数字“1”或“2”,但连续M格内不能都填“1”。
求符合条件的填法有多少种?
输入范围:2<=N<=[color=FF0000][b]50[/b],[/color]2<=M<=5,N>=M。
(注:我想要能在2秒之内出结果的算法,太慢的不给分。)
最后更新于:2008-04-22 09:53:00
回复列表 (共14个回复)
沙发
Mato完整版 [专家分:1270] 发布于 2008-04-22 09:59:00
这么简单的题目都做不出来,
难道没人做吗??????
[color=FFFFFF]你们就找不到规律吗?[/color]
[color=FF0000]你们就找不到规律吗?[/color]
[color=FFFF00]你们就找不到规律吗?[/color]
[color=00FF00]你们就找不到规律吗?[/color]
[color=0000FF]你们就找不到规律吗?[/color]
板凳
lucybaby [专家分:0] 发布于 2008-04-26 20:20:00
自己做呗,太厉害的看不上眼,像我这种一般般的,又不会做,再说,对你来说简单的,对我来说不简单啊!!!
3 楼
wzc1996 [专家分:1680] 发布于 2008-04-27 09:55:00
用排列组合做!
可以推出公式!
4 楼
wzc1996 [专家分:1680] 发布于 2008-04-27 09:59:00
公式!
2^N-2^(N-M)-1
5 楼
Mato完整版 [专家分:1270] 发布于 2008-04-27 11:29:00
楼上的公式不对。
其实这道题的公式很复杂的。
6 楼
moz [专家分:37620] 发布于 2008-04-27 13:24:00
2^N-2^(N-M-1)*(N-M+2)+(.......)
7 楼
moz [专家分:37620] 发布于 2008-04-27 13:45:00
请Mato验证一下结果:
2^N-2^(N-M)+1
跟4楼答案只差一点点。不知道是不是我错了,请验证一下。
8 楼
Mato完整版 [专家分:1270] 发布于 2008-04-27 13:51:00
错!
这道题用递推!
9 楼
moz [专家分:37620] 发布于 2008-04-27 15:38:00
的确是我漏眼了,这答案的确不太恰当,正确答案如下:
[color=0000ff]Function NewMoz(N, M) As Long
NewMoz = 2 ^ N - 2 ^ (N - M + 1) + 1 - NewMoz2(N, M)
End Function
Function NewMoz2(N, M) As Long
For i = 1 To N - M - 1
If i < M Then j = 2 ^ i - 1 Else j = NewMoz(i, M) - 1
S = S + (j * 2 ^ (N - M - 1 - i))
Next
NewMoz2 = S
End Function[/color]
以下代码是验证程序,是在EXCEL里面写的,关键是 N-M
只要(N-M)相同,剔除的个数也是相等的。
Sub main1()
Debug.Print Timer
N = 12
M = 8
x$ = String$(N, 49) & String$(N, 50)
y$ = Right$(x$, N)
c$ = String$(M, 49)
a$ = y$
Do
b$ = a$
Do
Debug.Print b$,
KK = KK + 1
If InStr(b$, c$) Then
K2 = K2 + 1
Debug.Print "YES"
Else
Debug.Print
End If
b$ = nextpl$(b$)
Loop Until b$ = a$
a$ = nextzh$(x$, a$)
Loop Until a$ = y$
Debug.Print KK, KK - K2, NewMoz(N, M)
Debug.Print Timer
End Sub
Function nextpl$(a$)
l = Len(a$)
For e = (l - 1) To 1 Step -1
If Mid$(a$, e, 1) < Mid$(a$, e + 1, 1) Then Exit For
Next
If e > 0 Then
For i = l To (e + 1) Step -1
If Mid$(a$, i, 1) > Mid$(a$, e, 1) Then Exit For
Next
b$ = Mid$(a$, i, 1)
Mid$(a$, i, 1) = Mid$(a$, e, 1)
Mid$(a$, e, 1) = b$
End If
For i = (e + 1) To (l + e + 1) \ 2
j = l + e + 1 - i
b$ = Mid$(a$, i, 1)
Mid$(a$, i, 1) = Mid$(a$, j, 1)
Mid$(a$, j, 1) = b$
Next
nextpl$ = a$
End Function
Function nextzh$(a$, b$)
For i = 1 To Len(b$)
If InStr(1, a$, Mid$(b$, i, 1)) > i Then
Mid$(b$, 1, i) = Mid$(a$, InStr(1, a$, Mid$(b$, i, 1)) - i, i)
Exit For
End If
Next
If i > Len(b$) Then b$ = Right$(a$, Len(b$))
nextzh$ = b$
End Function
Function NewMoz(N, M) As Long
NewMoz = 2 ^ N - 2 ^ (N - M + 1) + 1 - NewMoz2(N, M)
End Function
Function NewMoz2(N, M) As Long
For i = 1 To N - M - 1
If i < M Then j = 2 ^ i - 1 Else j = NewMoz(i, M) - 1
S = S + (j * 2 ^ (N - M - 1 - i))
Next
NewMoz2 = S
End Function[/color]
10 楼
Mato完整版 [专家分:1270] 发布于 2008-04-27 15:42:00
不对!
我调用你这个函数,输入15,4,输出19456,正确答案应为20569!
我来回复