Skip to content

Commit c838aa4

Browse files
committed
feat: 和谐区间算法
1 parent 76d6a82 commit c838aa4

1 file changed

Lines changed: 94 additions & 0 deletions

File tree

JS/algorithm/pDd/和谐区间.js

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
// 多多路上从左到右有N棵树(编号1~N),其中第i个颗树有和谐值Ai。
2+
// 多多鸡认为,如果一段连续的树,它们的和谐值之和可以被M整除,那么这个区间整体看起来就是和谐的。
3+
// 现在多多鸡想请你帮忙计算一下,满足和谐条件的区间的数量。
4+
5+
// 首先注意 要求取整,那么能进行 %取余 的地方就要取余,防止精度丢失
6+
// 例如在 readline 拿到数组之后就 map 进行 % : const nums = (await readline()).split(' ').map(item => { return item % M })
7+
8+
// 想要取整,本质就是区间%0,那么就是两头的前缀和在%M后相等 => 相减后为0
9+
const rl = require("readline").createInterface({ input: process.stdin });
10+
var iter = rl[Symbol.asyncIterator]();
11+
const readline = async () => (await iter.next()).value;
12+
13+
void async function () {
14+
// Write your code here
15+
const [n, M] = (await readline()).split(' ')
16+
const nums = (await readline()).split(' ').map(item => { return item % M })
17+
18+
let cur = 0
19+
// const pres = [0]
20+
const pres = new Map()
21+
pres.set(0, 1) // 空前缀
22+
let ans = 0
23+
if (!nums.length) {
24+
console.log(0)
25+
return
26+
}
27+
for (const num of nums) {
28+
cur = (cur + num) % M
29+
const pre = pres.get(cur) || 0
30+
ans += pre
31+
pres.set(cur, pre + 1)
32+
}
33+
console.log(ans)
34+
}()
35+
36+
37+
// 6/10 在遍历过程中进行统计
38+
const rl = require("readline").createInterface({ input: process.stdin });
39+
var iter = rl[Symbol.asyncIterator]();
40+
const readline = async () => (await iter.next()).value;
41+
42+
void async function () {
43+
// Write your code here
44+
const [n, M] = (await readline()).split(' ')
45+
const nums = (await readline()).split(' ').map(item => { return item % M })
46+
// .map取余
47+
48+
let cur = 0
49+
const pres = [0]
50+
let ans = 0
51+
if (!nums.length) {
52+
console.log(0)
53+
return
54+
}
55+
for (const num of nums) {
56+
cur = (cur + num) % M
57+
for (const pre of pres) {
58+
if ((cur - pre) % M == 0)
59+
ans += 1
60+
}
61+
pres.push(cur)
62+
}
63+
console.log(ans)
64+
}()
65+
66+
67+
// 1/10 没有在遍历过程中就进行统计
68+
const rl = require("readline").createInterface({ input: process.stdin });
69+
var iter = rl[Symbol.asyncIterator]();
70+
const readline = async () => (await iter.next()).value;
71+
72+
void async function () {
73+
// Write your code here
74+
const [n, M] = (await readline()).split(' ')
75+
const nums = (await readline()).split(' ').map(item => { return item % M })
76+
// console.log(nums)
77+
if (!nums.length) {
78+
console.log(0)
79+
return
80+
}
81+
const pre = [0]
82+
for (let i = 0; i < n; i++) {
83+
pre.push((pre[pre.length - 1] + nums[i]) % M)
84+
// 要求整除,那么处理的时候就可以取余
85+
}
86+
let ans = 0
87+
for (let i = 0; i < n; i++) {
88+
for (let j = i + 1; j < n + 1; j++) {
89+
if ((pre[j] - pre[i]) % M == 0)
90+
ans += 1
91+
}
92+
}
93+
console.log(ans)
94+
}()

0 commit comments

Comments
 (0)