题解:P14533 [RMI 2018] 松鼠 / Squirrel
zhujianheng · · 题解
我们发现只有
所以考虑所有
预处理呢?预处理的时间复杂度
发现这个互质可以 bitset,只要不互质的为
注意到
时间复杂度
#include <bits/stdc++.h>
using namespace std;
//#define int long long
const int N = 60009;
bitset<N> g[N];
int isPrime[N];
int m, n, F, ans;
//unordered_map<int, int> mp;
void f(int x, int y) {
if (!g[x - 1][y - 1] && x >= 1 && x <= m && y >= 1 && y <= n)
ans++;
}
void dfs(int x, int y, int p, int c) {
if (p == 1) {
if (c == 0)
f(x - 1, y);
if (c == 1)
f(x, y - 1);
if (c == 2)
f(x + 1, y);
if (c == 3)
f(x, y + 1);
return;
}
//f(x, y);
if (c == 0) {
for (int i = 1; i <= p; i++)
x--, f(x, y);
for (int i = 1; i <= p / 2; i++)
x--, y--, f(x, y);
dfs(x, y, p / 2, 0);
dfs(x, y, p / 2, 1);
x += p / 2;
y += p / 2;
for (int i = 1; i <= p / 2; i++)
x--, y++, f(x, y);
dfs(x, y, p / 2, 0);
dfs(x, y, p / 2, 3);
}
if (c == 1) {
for (int i = 1; i <= p; i++)
y--, f(x, y);
for (int i = 1; i <= p / 2; i++)
x--, y--, f(x, y);
dfs(x, y, p / 2, 1);
dfs(x, y, p / 2, 0);
x += p / 2;
y += p / 2;
for (int i = 1; i <= p / 2; i++)
x++, y--, f(x, y);
dfs(x, y, p / 2, 1);
dfs(x, y, p / 2, 2);
}
if (c == 2) {
for (int i = 1; i <= p; i++)
x++, f(x, y);
for (int i = 1; i <= p / 2; i++)
x++, y++, f(x, y);
dfs(x, y, p / 2, 2);
dfs(x, y, p / 2, 3);
x -= p / 2;
y -= p / 2;
for (int i = 1; i <= p / 2; i++)
x++, y--, f(x, y);
dfs(x, y, p / 2, 2);
dfs(x, y, p / 2, 1);
}
if (c == 3) {
for (int i = 1; i <= p; i++)
y++, f(x, y);
for (int i = 1; i <= p / 2; i++)
x++, y++, f(x, y);
dfs(x, y, p / 2, 2);
dfs(x, y, p / 2, 3);
x -= p / 2;
y -= p / 2;
for (int i = 1; i <= p / 2; i++)
x--, y++, f(x, y);
dfs(x, y, p / 2, 3);
dfs(x, y, p / 2, 0);
}
}
signed main() {
//freopen("squirrel1.in", "r", stdin);
//freopen("squirrel1.out", "w", stdout);
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> m >> n >> F;
isPrime[1] = 0;
for (int i = 2; i <= 51000; i++)
isPrime[i] = 1;
for (int i = 2; i * i <= 51000; i++) {
if (isPrime[i])
for (int j = i * i; j <= 51000; j += i)
isPrime[j] = 0;
}
for (int i = 2; i <= 51000; i++)
g[1][i] = 0, g[0][i] = 1;
for (int i = 2; i <= 51000; i++) {
g[i][1] = 0;
g[i][0] = 1;
if (isPrime[i]) {
for (int j = i; j <= 51000; j += i)
g[i][j] = 1;
} else
for (int j = 2; j <= sqrt(i); j++)
if (i % j == 0) {
g[i] = g[j] | g[i / j];
break;
}
}
for (int i = 1; i <= F; i++) {
int x, y, p;
cin >> x >> y >> p;
f(x, y);
dfs(x, y, p, 0);
}
cout << ans << endl;
return 0;
}