Skip to content

Commit aa85679

Browse files
committed
Create Fancy.ts
1 parent 8884d6f commit aa85679

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

fancy-sequence/Fancy.ts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
const MOD = 1000000007n;
2+
export default interface Fancy {
3+
getIndex: (idx: number) => number;
4+
multAll: (m: number) => void;
5+
addAll: (inc: number) => void;
6+
append: (val: number) => void;
7+
}
8+
9+
export default function Fancy(): Fancy {
10+
const values: bigint[] = [];
11+
let add = 0n;
12+
let mult = 1n;
13+
let r_mult = 1n;
14+
15+
const append = function (val: number): void {
16+
const result = ((BigInt(val) - add + MOD) * r_mult) % MOD;
17+
values.push(result);
18+
};
19+
20+
const addAll = function (inc: number): void {
21+
add = (add + BigInt(inc)) % MOD;
22+
};
23+
24+
const multAll = function (m: number): void {
25+
const mb = BigInt(m);
26+
mult = (mult * mb) % MOD;
27+
add = (add * mb) % MOD;
28+
29+
r_mult = (r_mult * multiplicativeInverse(m, MOD)) % MOD;
30+
};
31+
32+
const getIndex = function (idx: number): number {
33+
if (idx >= values.length) return -1;
34+
return Number((mult * BigInt(values[idx]) + add) % MOD);
35+
};
36+
return { getIndex, multAll, addAll, append };
37+
}
38+
39+
const multiplicativeInverse = function (x: number, mod: bigint): bigint {
40+
if (typeof INVERSES[x] !== "undefined") return INVERSES[x];
41+
const xb = BigInt(x);
42+
const mb = BigInt(mod);
43+
let y = 1n,
44+
m = mb,
45+
p = xb;
46+
m = m - 2n;
47+
48+
for (let i = 0n; 1n << i < m; i++, p = (p * p) % mb)
49+
if (((m >> i) & 1n) == 1n) y = (y * p) % mb;
50+
INVERSES[x] = y;
51+
return y;
52+
};
53+
54+
const INVERSES: bigint[] = [];

0 commit comments

Comments
 (0)