-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathfast_transposition.cpp
executable file
·72 lines (62 loc) · 1.95 KB
/
fast_transposition.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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <iostream>
#include <vector>
using namespace std;
vector<int> generate_input(int n, int seed) {
vector<int> d(n * n);
for (size_t i = 0; i < d.size(); ++i) {
d[i] = seed;
seed = ((long long) seed * 197 + 2017) & 987654;
}
return d;
}
long long get_hash(const vector<int> &d) {
const long long MOD = 987654321054321LL;
const long long MUL = 179;
long long result_value = 0;
for (size_t i = 0; i < d.size(); ++i)
result_value = (result_value * MUL + d[i]) & MOD;
return result_value;
}
void transpose(vector<int> &m, int imin, int jmin, int side, int n) {
const int BLOCK = 8;
int tmp;
for (int i = 0; i < side; i += BLOCK) {
for (int j = i; j < side; j += BLOCK) {
for (int ib = i; ib < i + BLOCK && ib < side; ++ib) {
for (int jb = (j <= ib) ? ib + 1 : j; jb < j + BLOCK && jb < side; ++jb) {
/*tmp = m[(imin + ib) * n + (jmin + jb)];
m[(imin + ib) * n + (jmin + jb)] = m[(imin + jb) * n + (jmin + ib)];
m[(imin + jb) * n + (jmin + ib)] = tmp;*/
m[(imin + ib) * n + (jmin + jb)] ^= m[(imin + jb) * n + (jmin + ib)];
m[(imin + jb) * n + (jmin + ib)] ^= m[(imin + ib) * n + (jmin + jb)];
m[(imin + ib) * n + (jmin + jb)] ^= m[(imin + jb) * n + (jmin + ib)];
}
}
}
}
}
void print(vector<int> &m, int n) {
for (int i = 0; i < n; ++i) {
for (int j = 0; j < n; ++j) {
cout << m[i * n + j] << "\t";
}
cout << endl;
}
cout << endl;
}
int main() {
int n, k, imin, jmin, side;
int seed;
cin >> n;
cin >> seed;
cin >> k;
vector<int> m = generate_input(n, seed);
for (int i = 0; i < k; ++i) {
cin >> imin;
cin >> jmin;
cin >> side;
transpose(m, imin, jmin, side, n);
}
cout << get_hash(m);
return 0;
}