1. 程式人生 > >饑餓的小易(規律,同余大數)

饑餓的小易(規律,同余大數)

sub ner 貝殼 同余 易經 args 不變 移動 subject

題目描述

小易總是感覺饑餓,所以作為章魚的小易經常出去尋找貝殼吃。最開始小易在一個初始位置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
 1 import java.util.Scanner;
 2 
 3 /**
 4  * 饑餓的小易 
 5  * 1、分析
 6  *      4x+3 
 7  *         8x+7 
 8  *      4(4x+3)+3 = 16x+15
 9  *       4(8x+7)+3 = 8(4x+3)+7 =32x+31 =32(x+1)-1 
10  *      每次 變換 得到的數 都是 
11  *      我們設 2^n 為 times,也有times(x+1)-1,a=2^n * x +(2^n)-1
12  *      循環檢查 a%N 是否為0 判斷 
13 * 2、最多使用 100000 次魔法 最多情況下就是都使用 8x+7, 14 * 而此時我們是使用2來循環 ,2^3 = 8 那麽我們就需要循環 300000次 15 * 但是,無論是 int 還是 long 都無法表示那麽大的數,所以我們需要做同余處理來進行替換 16 * 17 * 同余: 18 如果 a%m =b%m 那麽我們就說 ab關於模m同余 ,記作 a≡b(mod m) 19 不難理解 b = a%m 有 a≡b(mod m) 20 那麽: 21 設 a 、b 對於 m 的余數 都為 mod,可以這樣表示:
22 a = c1*m + mod 23 b = c2*m + mod(a1、a2為不同的整數) 24 a(x+1)-1 = (c1*m + mod)*(x+1)-1 = c1*m*(x+1) + mod*(x+1)-1 25 b(x+1)-1 = (c2*m + mod)*(x+1)-1 = c2*m*(x+1) + mod*(x+1)-1 26 c1*m*(x+1)、 c2*m*(x+1) 都是可以被 m整除 27 所以 a(x+1)-1 b(x+1)-1 對於 m 的余數 都為(mod*(x+1)-1)%m 28 也就是說 a≡b(mod m) ,ab做相同的加減乘除變換之後,對於m同余仍然成立 29 30 因此我們可以使用 times=times%N 來求 times對於N的同余數 ,前後 (times*(x+1)-1)%N 值不變可以做替換 31 * 32 * 33 * 34 * 4x+3 等於兩次 2x+1 8x+7 等於 三次 2x+1 35 * 36 * @author Dell 37 * 38 */ 39 public class Main { 40 static public long x = 125000000; 41 static public long N = 1000000007; 42 static public long count = -1; 43 static public long times = 4; //第一次最小為4 44 static public void f() { 45 for (int i = 1; i <=300000; i++) { 46 long mod = (times*(x+1)-1)%N; 47 if (mod == 0) { 48 // 取值 盡可能多取8來減小步數, 所以除以3 49 // times從4 開始 就是 2^2 而 i 從1開始必須加1 50 count=(i+1)/3 + ((i+1)%3==0?0:1); 51 return; 52 } 53 // 求下一個 times 並做替換 54 times = (times*2)%N; 55 } 56 } 57 public static void main(String[] args) { 58 Scanner sc = new Scanner(System.in); 59 x = sc.nextLong(); 60 f(); 61 System.out.println(count); 62 } 63 }

饑餓的小易(規律,同余大數)