码迷,mamicode.com
首页 > 其他好文 > 详细

编程题

时间:2018-04-20 13:22:15      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:++   易经   []   rgs   也有   ann   位置   输入   return   

 

饥饿的小易:

 小易总是感觉饥饿,所以作为章鱼的小易经常出去寻找贝壳吃。最开始小易在一个初始位置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         ... 4*1
 7  *         8x+7         ... 8*1
 8  *      4(4x+3)+3 = 16x+15        ... 4*4
 9  *       4(8x+7)+3 = 8(4x+3)+7 =32x+31 =32(x+1)-1   ... 4*8
10  *   
11  *      每次 变换 得到的数 都是 
12  *      我们设 2^n 为 times,也有times(x+1)-1,a=2^n * x +(2^n)-1
13  *      循环检查 a%N 是否为0 判断 
14  * 2、最多使用 100000 次魔法 最多情况下就是都使用 8x+7,
15  *  而此时我们是使用2来循环 ,2^3 = 8 那么我们就需要循环 300000次 
16  *  但是,无论是 int 还是 long 都无法表示那么大的数,所以我们需要做同余处理来进行替换
17  *  
18  *  同余:
19          如果 a%m =b%m 那么我们就说 ab关于模m同余 ,记作 a≡b(mod m) 
20          不难理解 b = a%m 有 a≡b(mod m) 
21          那么: 
22          设 a 、b 对于 m 的余数 都为 mod,可以这样表示: 
23         a = c1*m + mod 
24         b = c2*m + mod(a1、a2为不同的整数) 
25         a(x+1)-1 = (c1*m + mod)*(x+1)-1 = c1*m*(x+1) + mod*(x+1)-1 
26         b(x+1)-1 = (c2*m + mod)*(x+1)-1 = c2*m*(x+1) + mod*(x+1)-1 
27         c1*m*(x+1)、 c2*m*(x+1) 都是可以被 m整除 
28         所以 a(x+1)-1 b(x+1)-1 对于 m 的余数 都为(mod*(x+1)-1)%m 
29          也就是说 a≡b(mod m) ,ab做相同的加减乘除变换之后,对于m同余仍然成立 
30          
31      因此我们可以使用 times=times%N 来求 times对于N的同余数 ,前后 (times*(x+1)-1)%N 值不变可以做替换
32  * 
33  * 
34  * 
35  * 4x+3 等于两次 2x+1 8x+7 等于 三次 2x+1
36  * 
37  * @author Dell
38  *
39  */
40 public class Main {
41     static public long x = 125000000;
42     static public long N = 1000000007;
43     static public long count = -1;
44     static public long times = 4;  //第一次最小为4
45     static public void f() {
46 
47         for (int i = 1; i <=300000; i++) {
48             long mod = (times*(x+1)-1)%N;
49             if (mod == 0) {
50                 // 1、times从4 开始就是2^2 而 i 从1开始必须加1 此时 times = 2^i
51                 // 2、取值尽可能多取8来减小步数,所以除以3
52                 // 3、times = 2^n , 4 = 2^2 , 8=2^3
53                 //当余数为0时  times用 8 来表示  times = 8^n   count = n
54                 //当余数为2时  times用n个8 和 1个4来表示 times = 8^n * 4^1; count = n+1
55                 //当余数为1时  times用n个8 和 2来表示 times = 8^n * 2^1 
56                 //            为了凑成8和4表示 我们 可以换成:times = 8^(n-1)* 4^2这样换下来count的数值都是: count = n+1
57                 // 所以有 余数为0就取0 余数不为0就取1
58                 count=(i+1)/3 + ((i+1)%3==0?0:1);
59                 return;
60             }
61             // 求下一个 times 并做替换
62             times = (times*2)%N;
63         }
64     }
65 
66     public static void main(String[] args) {
67         Scanner sc = new Scanner(System.in);
68         x = sc.nextLong();
69         f();
70         System.out.println(count);
71 
72     }
73 }

 

编程题

标签:++   易经   []   rgs   也有   ann   位置   输入   return   

原文地址:https://www.cnblogs.com/the-wang/p/8889751.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!