回 帖 发 新 帖 刷新版面

主题:出一道送分题

在N个格子里填上数字“1”或“2”,但连续M格内不能都填“1”。
求符合条件的填法有多少种?
输入范围:2<=N<=[color=FF0000][b]50[/b],[/color]2<=M<=5,N>=M。

(注:我想要能在2秒之内出结果的算法,太慢的不给分。)

回复列表 (共14个回复)

沙发

这么简单的题目都做不出来,
难道没人做吗??????

[color=FFFFFF]你们就找不到规律吗?[/color]
[color=FF0000]你们就找不到规律吗?[/color]
[color=FFFF00]你们就找不到规律吗?[/color]
[color=00FF00]你们就找不到规律吗?[/color]
[color=0000FF]你们就找不到规律吗?[/color]

板凳

自己做呗,太厉害的看不上眼,像我这种一般般的,又不会做,再说,对你来说简单的,对我来说不简单啊!!!

3 楼

用排列组合做!
可以推出公式!

4 楼

公式!
2^N-2^(N-M)-1

5 楼

楼上的公式不对。

其实这道题的公式很复杂的。

6 楼

2^N-2^(N-M-1)*(N-M+2)+(.......)

7 楼

请Mato验证一下结果:
2^N-2^(N-M)+1
跟4楼答案只差一点点。不知道是不是我错了,请验证一下。

8 楼

错!
这道题用递推!

9 楼

的确是我漏眼了,这答案的确不太恰当,正确答案如下:

[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 楼

不对!
我调用你这个函数,输入15,4,输出19456,正确答案应为20569!

我来回复

您尚未登录,请登录后再回复。点此登录或注册