#include "vision.h"
#include<bits/stdc++.h>
using namespace std;
vector<int> pp;
void genpp(){
pp.push_back(1);
for (int i=2; i<=150; i++){
bool p = true;
for (int j=2; j<min(i, 15); j++){
if (i % j == 0) p = false;
}
if (p){
int cur = i;
while (cur <= 150){
pp.push_back(cur);
cur *= i;
}
}
}
sort(pp.begin(), pp.end());
}
void construct_network(int H, int W, int K) {
genpp();
for (int i=0; i<H; i++){
vector<int> v;
for (int j=0; j<W; j++) v.push_back(i*W+j);
add_or(v);
}
for (int j=0; j<W; j++){
vector<int> v;
for (int i=0; i<H; i++) v.push_back(i*W+j);
add_or(v);
}
int cur = H*W+H+W;
map<int,int> rip, cip;
for (int p : pp){
if (p > H) break;
int start = cur;
for (int i=0; i<p; i++){
vector<int> v;
for (int x=i; x<H; x+=p) v.push_back(H*W+x);
add_xor(v);
cur++;
}
vector<int> v;
for (int x=start; x<cur; x++) v.push_back(x);
add_or(v);
add_not(cur);
cur += 2;
rip[p] = cur-1;
}
//cout << cur-H*W << endl;
for (int p : pp){
if (p > W) break;
int start = cur;
for (int i=0; i<p; i++){
vector<int> v;
for (int x=i; x<W; x+=p) v.push_back(H*W+H+x);
add_xor(v);
cur++;
}
vector<int> v;
for (int x=start; x<cur; x++) v.push_back(x);
add_or(v);
add_not(cur);
cur += 2;
cip[p] = cur-1;
}
//cout << cur-H*W << endl;
vector<int> res;
for (int i=1; i<K; i++){
if (i > H-1) break;
if (K-i > W-1) continue;
vector<int> d, nd;
for (int p : pp){
if (p > H) break;
if (i % p == 0) d.push_back(rip[p]);
else nd.push_back(rip[p]);
}
add_and(d);
add_or(nd);
add_not(cur+1);
add_and({cur, cur+2});
d.clear(); nd.clear();
for (int p : pp){
if (p > W) break;
if ((K-i) % p == 0) d.push_back(cip[p]);
else nd.push_back(cip[p]);
}
add_and(d);
add_or(nd);
add_not(cur+5);
add_and({cur+4, cur+6});
add_and({cur+3, cur+7});
res.push_back(cur+8);
cur += 9;
}
if (K < W){
int x = K;
vector<int> d, nd;
for (int p : pp){
if (p > W) break;
if (x % p == 0) d.push_back(cip[p]);
else nd.push_back(cip[p]);
}
add_and(d);
add_or(nd);
add_not(cur+1);
add_and({cur, cur+2});
vector<int> v;
for (int i=0; i<H; i++) v.push_back(H*W+i);
add_xor(v);
add_and({cur+3, cur+4});
res.push_back(cur+5);
cur += 6;
}
if (K < H){
int x = K;
vector<int> d, nd;
for (int p : pp){
if (p > H) break;
if (x % p == 0) d.push_back(rip[p]);
else nd.push_back(rip[p]);
}
add_and(d);
add_or(nd);
add_not(cur+1);
add_and({cur, cur+2});
vector<int> v;
for (int i=0; i<W; i++) v.push_back(H*W+H+i);
add_xor(v);
add_and({cur+3, cur+4});
res.push_back(cur+5);
cur += 6;
}
//cout << cur-H*W << endl;
add_or(res);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |