forked from wisdompeak/LeetCode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path1714.Sum-Of-Special-Evenly-Spaced-Elements-In-Array_v1.cpp
55 lines (53 loc) · 1.71 KB
/
1714.Sum-Of-Special-Evenly-Spaced-Elements-In-Array_v1.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
class Solution {
long M = 1e9+7;
struct hashGenerator {
size_t operator()(const pair<int,int>& p) const
{
return hash<int>()(p.first) ^ hash<int>()(p.second);
}
};
public:
vector<int> solve(vector<int>& nums, vector<vector<int>>& queries)
{
int n = nums.size();
unordered_map<pair<int,int>, vector<long>, hashGenerator>presum;
vector<int>rets;
for (auto query: queries)
{
int s = query[0];
int d = query[1];
if (d >= sqrt(n))
{
long sum = 0;
int i = s;
while (i < n)
{
sum = (sum+nums[i])%M;
i+=d;
}
rets.push_back(sum);
}
else
{
int offset = s%d;
if (presum.find({d,offset})==presum.end())
{
vector<long>temp((n-1-offset)/d+1);
long sum = 0;
int i = 0;
while (offset + i*d < n)
{
sum = (sum + (long)nums[offset + i*d])%M;
temp[i] = sum;
i++;
}
presum[{d,offset}] = temp;
}
long x = presum[{d,offset}][(n-1-offset)/d];
long y = (s-1-offset) < 0? 0: presum[{d,offset}][(s-1-offset)/d];
rets.push_back(((x - y )%M + M)%M);
}
}
return rets;
}
};