本週早些時候,學弟給我發了一道網易的筆試題,飢餓的小易,感受有點意思~分享給你們python
題目描述:spa
小易老是感受飢餓,因此做爲章魚的小易常常出去尋找貝殼吃。最開始小易在一個初始位置x_0。對於小易所處的當前位置x,他只能經過神祕的力量移動到 4 * x + 3或者c。由於使用神祕力量要耗費太多體力,因此它只能使用神祕力量最多100,000次。貝殼總生長在能被1,000,000,007整除的位置(好比:位置0,位置1,000,000,007,位置2,000,000,014等)。小易須要你幫忙計算最少須要使用多少次神祕力量就能吃到貝殼。code
輸入:blog
輸入一個初始位置x_0,範圍在1到1,000,000,006utf-8
輸出:字符串
輸出小易最少須要使用神祕力量的次數,若是使用次數使用完還沒找到貝殼,則輸出-1get
乍一看這道題,是有點懵逼的,若是用暴力法來作100%超時。以個人經驗來看估計這是一道數學問題,咱們就分析一下題目描述中的關鍵信息吧,看看有沒有什麼玄機。小章魚只能移動到4 * x + 3或者8 * x + 7,那咱們認爲f(x)=4 * x + 3, g(x)=8 * x + 7。關鍵部分到了,我瞪倆眼睛觀察了很久,終於發現input
1. f(g(x)) = g(f(x)) 咱們能夠認爲最終小章魚的移動路線是能夠用fg表示的字符串,並且fg能夠隨意調換位置~因此說膩,ffggffgf=fffffggg數學
2. f(f(f(x)))=g(g(x)) 也就是說,每作3次f移動等於2次g移動,那麼咱們能夠將結果的fg串中每3個f換成2個g,那麼結果的fg串是一個最多包含2個f的fg串~因此說膩,fffffggg=ffgggggclass
如今解題思路就很清晰了,以0,f,ff爲起始位置,每次都移動g,看何時能移動到能被1000000007整除的位置。代碼以下:
#!/usr/bin/python # -*- coding: utf-8 -*- def get_result(n): l_ = [n, n * 4 + 3, 16 * n + 15] for j, m in enumerate(l_): for i in range(100000): m = (8 * m + 7) % 1000000007 if m == 0: return i+j+1 return -1 if __name__ == '__main__': n = input() print get_result(n)
好啦,這道題到此已經完美解決啦~
但願對你們有所幫助~