本周早些時候,學弟給我發了一道網易的筆試題,飢餓的小易,感覺有點意思~分享給大家
題目描述:
小易總是感覺飢餓,所以作為章魚的小易經常出去尋找貝殼吃。最開始小易在一個初始位置x_0。對於小易所處的當前位置x,他只能通過神秘的力量移動到 4 * x + 3或者c。因為使用神秘力量要耗費太多體力,所以它只能使用神秘力量最多100,000次。貝殼總生長在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你幫忙計算最少需要使用多少次神秘力量就能吃到貝殼。
輸入:
輸入一個初始位置x_0,范圍在1到1,000,000,006
輸出:
輸出小易最少需要使用神秘力量的次數,如果使用次數使用完還沒找到貝殼,則輸出-1
乍一看這道題,是有點懵逼的,如果用暴力法來做100%超時。以我的經驗來看估計這是一道數學問題,我們就分析一下題目描述中的關鍵信息吧,看看有沒有什么玄機。小章魚只能移動到4 * x + 3或者8 * x + 7,那我們認為f(x)=4 * x + 3, g(x)=8 * x + 7。關鍵部分到了,我瞪倆眼睛觀察了好久,終於發現
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=ffggggg
現在解題思路就很清晰了,以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)
好啦,這道題到此已經完美解決啦~
希望對大家有所幫助~