尤拉計劃622:洗牌
一副牌被分成兩等分,上半疊在左手,下半疊在右手。接下來,卡被完全交錯,右半部的最上卡正好插在左半部的最上卡之後,右半部的第二張卡正好插在左半部的第二張卡之後,等等(注意這個過程保留了牌組上下卡的位置)
令s(n)是大小為n的牌組恢復其原始配置所需的最小連續重複洗牌次數,其中n是一個正偶數。
令人驚訝的是,一副52張牌的標準撲克只要完全洗8次牌將就會返回到原來的配置,所以s(52)=8
可以證實一個86張牌的牌組也會在洗8次牌後恢復到原來的配置 。
滿足s(n)=8的所有n值之和s(n)=412
求滿足s(n)=60的所有n值之和
下面的簡單程式可以測試
def sf(x):
return [ x[:len(x)//2][i] if j%2==0 else x[len(x)//2:][i] for i in range(0,len(x)//2) for j in range(2)]
def test(n):
c=0
x=list(range(1,n+1))
xm=[i for i in x]
while True:
c+=1
xm=sf(xm)
if x==xm:return c
>>> test(52)
8
>>> test(84)
82
>>> test(86)
8
>>> [i for i in range(2,300,2) if test(i)==8]
[18, 52, 86, 256]
>>> sum([i for i in range(2,300,2) if test(i)==8])
412
>>> [i for i in range(2,300,2) if test(i)==60]
[62, 144, 176, 184, 226, 288]
通過分析每輪洗牌後牌的變化,相鄰兩牌的間隔從n/2開始,每次間隔都縮小1半,如果遇到奇數,則加上n-1之後再縮小,一直下去到間隔等於1之後就恢復原狀了。因此得到如下快一點的版本
def gen(x):
n=x
c=0
while n>1:
if n%2==0:n//=2 ;c+=1 #;print(n)
else: n+=(x-1)
return c
def s(n):
return [i for i in range(2,2**n+1,2) if gen(i)==n]
>>> s(12)
[14, 36, 40, 46, 66, 92, 106, 118, 196, 274, 316, 456, 586, 820, 1366, 4096]
>>> s(13)
[8192]
>>> s(14)
[44, 130, 382, 5462, 16384]
相關文章
- 尤拉計劃700:尤拉幣
- 尤拉計劃698:123數
- 尤拉計劃696:麻將
- 尤拉計劃719:拆分數
- 尤拉計劃699:三腳數
- 尤拉計劃706:三象數
- 尤拉計劃718:不可達數
- 尤拉計劃686:2的冪
- 尤拉計劃715:六元組
- 尤拉計劃709:偶數袋
- 尤拉計劃708:你只要2
- 尤拉計劃712:指數差
- 尤拉計劃749:近似冪和
- 尤拉計劃739:和的和
- 尤拉計劃751:串聯重合
- 尤拉計劃745:平方和
- 尤拉計劃717:取模公式之和公式
- 尤拉計劃722:慢收斂系列
- 尤拉計劃695:隨機長方形隨機
- 尤拉計劃694:立方滿因數
- 尤拉計劃725:數位之和數
- 尤拉計劃710:1百萬會員
- 尤拉計劃723:畢達哥拉斯四邊形
- 尤拉計劃697:隨機衰減序列隨機
- 尤拉計劃713:圖蘭熱水系統
- 尤拉計劃711:二進位制黑板
- 尤拉計劃748:倒丟蕃多方程
- 尤拉計劃747:三角披薩
- 尤拉計劃657:不完整的單詞
- 尤拉計劃721:無理數高次冪
- 尤拉計劃701:隨機連線區域隨機
- 尤拉計劃714:兩種數位的數
- 尤拉計劃658:不完整的單詞(2)
- 尤拉計劃735:2n^2的因數
- 尤拉計劃705:除數序列的逆轉次數
- 尤拉計劃621:把整數表示為三角數之和
- 尤拉計劃704:二項式係數中的2因數
- 尤拉方程