鏈接:https://www.nowcoder.com/questionTerminal/5ee8df898312465a95553d82ad8898c3
來源:牛客網
小易總是感覺飢餓,所以作爲章魚的小易經常出去尋找貝殼吃。最開始小易在一個初始位置x_0。對於小易所處的當前位置x,他只能通過神祕的力量移動到 4 * x + 3或者8 * x + 7。因爲使用神祕力量要耗費太多體力,所以它只能使用神祕力量最多100,000次。貝殼總生長在能被1,000,000,007整除的位置(比如:位置0,位置1,000,000,007,位置2,000,000,014等)。小易需要你幫忙計算最少需要使用多少次神祕力量就能吃到貝殼。
輸入描述:
輸入一個初始位置x_0,範圍在1到1,000,000,006
輸出描述:
輸出小易最少需要使用神祕力量的次數,如果使用次數使用完還沒找到貝殼,則輸出-1
示例1
輸入
125000000
輸出
1
解題思路:
/**思路:
* 小易的移動方程
* f(x) = 4 * x + 3;
* g(x) = 8 * x + 7;
*
* 計算可以得出規律:
* 1.g(f(x)) = f(g(x))
* 2.f(f(f(x))) = g(g(x)) 也就是三次f(x) = 兩次g(x)
*
* 有規律1 所以可以存在:ffggfggff = fffffgggg
* 有規律2 所以可以存在:fffffgggg = ffgggggg
*
* 可以得出一個最有策略:f的執行次數爲0,1,2。-> x,4*x + 3,4(4*x+3) + 3
* 在f的執行基礎上求最小g的執行次數
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long num = sc.nextLong();
long m = 1000000007;
long mystery = 100000;
long [] begin = new long[3];
begin[0] = num;
begin[1] = 4*begin[0]+3;
begin[2] = 4*begin[1]+3;
long step = 0;
long minStep = mystery;
long cur = 0;
for(int i = 0;i<3;i++){
step = i;
cur = begin[i];
while (cur!=0 && step<minStep ){//條件二:如果算出比當前更長的step就不需要算下去了
cur = (8*cur+7)%m;
step++;
}
if(step<minStep)
minStep = step;
}
if(minStep<mystery)
System.out.println(minStep);
else
System.out.println(-1);
}
}