39
39
``` python
40
40
class Solution :
41
41
def waysToStep (self , n : int ) -> int :
42
- if n < 3 :
43
- return n
44
42
a, b, c = 1 , 2 , 4
45
- for _ in range (4 , n + 1 ):
46
- a, b, c = b, c, (a + b + c) % 1000000007
47
- return c
43
+ mod = 10 ** 9 + 7
44
+ for _ in range (n - 1 ):
45
+ a, b, c = b, c, (a + b + c) % mod
46
+ return a
47
+ ```
48
+
49
+ ``` python
50
+ class Solution :
51
+ def waysToStep (self , n : int ) -> int :
52
+ mod = 10 ** 9 + 7
53
+
54
+ def mul (a : List[List[int ]], b : List[List[int ]]) -> List[List[int ]]:
55
+ m, n = len (a), len (b[0 ])
56
+ c = [[0 ] * n for _ in range (m)]
57
+ for i in range (m):
58
+ for j in range (n):
59
+ for k in range (len (a[0 ])):
60
+ c[i][j] = (c[i][j] + a[i][k] * b[k][j] % mod) % mod
61
+ return c
62
+
63
+ def pow (a : List[List[int ]], n : int ) -> List[List[int ]]:
64
+ res = [[4 , 2 , 1 ]]
65
+ while n:
66
+ if n & 1 :
67
+ res = mul(res, a)
68
+ n >>= 1
69
+ a = mul(a, a)
70
+ return res
71
+
72
+ if n < 4 :
73
+ return 2 ** (n - 1 )
74
+ a = [[1 , 1 , 0 ], [1 , 0 , 1 ], [1 , 0 , 0 ]]
75
+ return sum (pow (a, n - 4 )[0 ]) % mod
48
76
```
49
77
50
78
### ** Java**
51
79
52
80
``` java
53
81
class Solution {
54
82
public int waysToStep (int n ) {
55
- if (n < 3 ) {
56
- return n;
83
+ final int mod = (int ) 1e9 + 7 ;
84
+ int a = 1 , b = 2 , c = 4 ;
85
+ for (int i = 1 ; i < n; ++ i) {
86
+ int t = a;
87
+ a = b;
88
+ b = c;
89
+ c = (((a + b) % mod) + t) % mod;
90
+ }
91
+ return a;
92
+ }
93
+ }
94
+ ```
95
+
96
+ ``` java
97
+ class Solution {
98
+ private final int mod = (int ) 1e9 + 7 ;
99
+
100
+ public int waysToStep (int n ) {
101
+ if (n < 4 ) {
102
+ return (int ) Math . pow(2 , n - 1 );
103
+ }
104
+ long [][] a = {{1 , 1 , 0 }, {1 , 0 , 1 }, {1 , 0 , 0 }};
105
+ long [][] res = pow(a, n - 4 );
106
+ long ans = 0 ;
107
+ for (long x : res[0 ]) {
108
+ ans = (ans + x) % mod;
109
+ }
110
+ return (int ) ans;
111
+ }
112
+
113
+ private long [][] mul (long [][] a , long [][] b ) {
114
+ int m = a. length, n = b[0 ]. length;
115
+ long [][] c = new long [m][n];
116
+ for (int i = 0 ; i < m; ++ i) {
117
+ for (int j = 0 ; j < n; ++ j) {
118
+ for (int k = 0 ; k < b. length; ++ k) {
119
+ c[i][j] = (c[i][j] + a[i][k] * b[k][j] % mod) % mod;
120
+ }
121
+ }
122
+ }
123
+ return c;
124
+ }
125
+
126
+ private long [][] pow (long [][] a , int n ) {
127
+ long [][] res = {{4 , 2 , 1 }};
128
+ while (n > 0 ) {
129
+ if ((n & 1 ) == 1 ) {
130
+ res = mul(res, a);
131
+ }
132
+ a = mul(a, a);
133
+ n >> = 1 ;
57
134
}
135
+ return res;
136
+ }
137
+ }
138
+ ```
139
+
140
+ ### ** C++**
141
+
142
+ ``` cpp
143
+ class Solution {
144
+ public:
145
+ int waysToStep(int n) {
146
+ const int mod = 1e9 + 7;
58
147
int a = 1, b = 2, c = 4;
59
- for (int i = 4 ; i <= n; ++ i) {
148
+ for (int i = 1 ; i < n; ++i) {
60
149
int t = a;
61
150
a = b;
62
151
b = c;
63
- c = ((a + b) % 1000000007 + t) % 1000000007 ;
152
+ c = (((a + b) % mod) + t) % mod;
153
+ }
154
+ return a;
155
+ }
156
+ };
157
+ ```
158
+
159
+ ```cpp
160
+ class Solution {
161
+ public:
162
+ int waysToStep(int n) {
163
+ if (n < 4) {
164
+ return pow(2, n - 1);
165
+ }
166
+ vector<vector<ll>> a = {{1, 1, 0}, {1, 0, 1}, {1, 0, 0}};
167
+ vector<vector<ll>> res = qpow(a, n - 4);
168
+ ll ans = 0;
169
+ for (ll x : res[0]) {
170
+ ans = (ans + x) % mod;
171
+ }
172
+ return ans;
173
+ }
174
+
175
+ private:
176
+ using ll = long long;
177
+ const int mod = 1e9 + 7;
178
+ vector<vector<ll>> mul(vector<vector<ll>>& a, vector<vector<ll>>& b) {
179
+ int m = a.size(), n = b[0].size();
180
+ vector<vector<ll>> c(m, vector<ll>(n));
181
+ for (int i = 0; i < m; ++i) {
182
+ for (int j = 0; j < n; ++j) {
183
+ for (int k = 0; k < b.size(); ++k) {
184
+ c[i][j] = (c[i][j] + a[i][k] * b[k][j] % mod) % mod;
185
+ }
186
+ }
64
187
}
65
188
return c;
66
189
}
190
+
191
+ vector<vector<ll>> qpow(vector<vector<ll>>& a, int n) {
192
+ vector<vector<ll>> res = {{4, 2, 1}};
193
+ while (n) {
194
+ if (n & 1) {
195
+ res = mul(res, a);
196
+ }
197
+ a = mul(a, a);
198
+ n >>= 1;
199
+ }
200
+ return res;
201
+ }
202
+ };
203
+ ```
204
+
205
+ ### ** Go**
206
+
207
+ ``` go
208
+ func waysToStep (n int ) int {
209
+ const mod int = 1e9 + 7
210
+ a , b , c := 1 , 2 , 4
211
+ for i := 1 ; i < n; i++ {
212
+ a, b, c = b, c, (a+b+c)%mod
213
+ }
214
+ return a
215
+ }
216
+ ```
217
+
218
+ ``` go
219
+ const mod = 1e9 + 7
220
+
221
+ func waysToStep (n int ) (ans int ) {
222
+ if n < 4 {
223
+ return int (math.Pow (2 , float64 (n-1 )))
224
+ }
225
+ a := [][]int {{1 , 1 , 0 }, {1 , 0 , 1 }, {1 , 0 , 0 }}
226
+ res := pow (a, n-4 )
227
+ for _ , x := range res[0 ] {
228
+ ans = (ans + x) % mod
229
+ }
230
+ return
231
+ }
232
+
233
+ func mul (a , b [][]int ) [][]int {
234
+ m , n := len (a), len (b[0 ])
235
+ c := make ([][]int , m)
236
+ for i := range c {
237
+ c[i] = make ([]int , n)
238
+ }
239
+ for i := 0 ; i < m; i++ {
240
+ for j := 0 ; j < n; j++ {
241
+ for k := 0 ; k < len (b); k++ {
242
+ c[i][j] = (c[i][j] + a[i][k]*b[k][j]%mod) % mod
243
+ }
244
+ }
245
+ }
246
+ return c
247
+ }
248
+
249
+ func pow (a [][]int , n int ) [][]int {
250
+ res := [][]int {{4 , 2 , 1 }}
251
+ for n > 0 {
252
+ if n&1 == 1 {
253
+ res = mul (res, a)
254
+ }
255
+ a = mul (a, a)
256
+ n >>= 1
257
+ }
258
+ return res
67
259
}
68
260
```
69
261
@@ -75,74 +267,97 @@ class Solution {
75
267
* @return {number}
76
268
*/
77
269
var waysToStep = function (n ) {
78
- if (n < 3 ) return n;
79
- let a = 1 ,
80
- b = 2 ,
81
- c = 4 ;
82
- for (let i = 3 ; i < n; i++ ) {
83
- [a, b, c] = [b, c, (a + b + c) % 1000000007 ];
270
+ let [a, b, c] = [1 , 2 , 4 ];
271
+ const mod = 1e9 + 7 ;
272
+ for (let i = 1 ; i < n; ++ i) {
273
+ [a, b, c] = [b, c, (a + b + c) % mod];
84
274
}
85
- return c ;
275
+ return a ;
86
276
};
87
277
```
88
278
89
- ### ** C**
279
+ ``` js
280
+ /**
281
+ * @param {number} n
282
+ * @return {number}
283
+ */
90
284
91
- ``` c
92
- int waysToStep (int n) {
93
- if (n < 3) {
94
- return n;
285
+ const mod = 1e9 + 7 ;
286
+
287
+ var waysToStep = function (n ) {
288
+ if (n < 4 ) {
289
+ return Math .pow (2 , n - 1 );
95
290
}
96
- int a = 1, b = 2, c = 4, i = 4;
97
- while (i++ <= n) {
98
- int t = ((a + b) % 1000000007 + c) % 1000000007;
99
- a = b;
100
- b = c;
101
- c = t;
291
+ const a = [
292
+ [1 , 1 , 0 ],
293
+ [1 , 0 , 1 ],
294
+ [1 , 0 , 0 ],
295
+ ];
296
+ let ans = 0 ;
297
+ const res = pow (a, n - 4 );
298
+ for (const x of res[0 ]) {
299
+ ans = (ans + x) % mod;
300
+ }
301
+ return ans;
302
+ };
303
+
304
+ function mul (a , b ) {
305
+ const [m , n ] = [a .length , b[0 ].length ];
306
+ const c = Array .from ({ length: m }, () => Array .from ({ length: n }, () => 0 ));
307
+ for (let i = 0 ; i < m; ++ i) {
308
+ for (let j = 0 ; j < n; ++ j) {
309
+ for (let k = 0 ; k < b .length ; ++ k) {
310
+ c[i][j] =
311
+ (c[i][j] + Number ((BigInt (a[i][k]) * BigInt (b[k][j])) % BigInt (mod))) % mod;
312
+ }
313
+ }
102
314
}
103
315
return c;
104
316
}
317
+
318
+ function pow (a , n ) {
319
+ let res = [[4 , 2 , 1 ]];
320
+ while (n) {
321
+ if (n & 1 ) {
322
+ res = mul (res, a);
323
+ }
324
+ a = mul (a, a);
325
+ n >>= 1 ;
326
+ }
327
+ return res;
328
+ }
105
329
```
106
330
107
- ### **C++ **
331
+ ### ** C**
108
332
109
- ```cpp
110
- class Solution {
111
- public:
112
- int waysToStep(int n) {
113
- if (n < 3) {
114
- return n;
115
- }
116
- int a = 1, b = 2, c = 4, i = 4;
117
- while (i++ <= n) {
118
- int t = ((a + b) % 1000000007 + c) % 1000000007;
119
- a = b;
120
- b = c;
121
- c = t;
122
- }
123
- return c;
333
+ ``` c
334
+ int waysToStep (int n) {
335
+ const int mod = 1e9 + 7;
336
+ int a = 1, b = 2, c = 4;
337
+ for (int i = 1; i < n; ++i) {
338
+ int t = a;
339
+ a = b;
340
+ b = c;
341
+ c = (((a + b) % mod) + t) % mod;
124
342
}
125
- };
343
+ return a;
344
+ }
126
345
```
127
346
128
347
### **Rust**
129
348
130
349
```rust
131
350
impl Solution {
132
351
pub fn ways_to_step(n: i32) -> i32 {
133
- let mut dp = [1 , 2 , 4 ];
134
- let n = n as usize ;
135
- if n <= 3 {
136
- return dp [n - 1 ];
137
- }
138
- for _ in 3 .. n {
139
- dp = [
140
- dp [1 ],
141
- dp [2 ],
142
- (((dp [0 ] + dp [1 ]) % 1000000007 ) + dp [2 ]) % 1000000007 ,
143
- ];
352
+ let (mut a, mut b, mut c) = (1, 2, 4);
353
+ let m = 1000000007;
354
+ for _ in 1..n {
355
+ let t = a;
356
+ a = b;
357
+ b = c;
358
+ c = ((a + b) % m + t) % m;
144
359
}
145
- dp [ 2 ]
360
+ a
146
361
}
147
362
}
148
363
```
0 commit comments