Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstring>
- #include <vector>
- #include <list>
- #include <map>
- #include <set>
- #include <deque>
- #include <stack>
- #include <bitset>
- #include <algorithm>
- #include <functional>
- #include <numeric>
- #include <utility>
- #include <sstream>
- #include <iostream>
- #include <iomanip>
- #include <cstdio>
- #include <cmath>
- #include <cstdlib>
- #include <ctime>
- #include <memory.h>
- #include <cassert>
- using namespace std;
- #define FILENAME "nanobugs"
- int was[777][777];
- int where[777];
- vector <int> g[777];
- int main() {
- freopen(FILENAME ".in", "r", stdin);
- freopen(FILENAME ".out", "w", stdout);
- srand(8753);
- int n, a, b;
- scanf("%d %d %d", &n, &a, &b);
- if (n % 2 == 1 && a == 1) {
- printf("%d\n", -1);
- return 0;
- }
- if (n % 2 == 1 && a == 2 && b == 1) {
- int parts[8];
- vector<int> gen;
- for (int i = 0; i < n; i++) {
- gen.push_back(0);
- }
- for (int i = 0; i < 7; i++) {
- gen.push_back(1);
- }
- while (true) {
- random_shuffle(gen.begin(), gen.end());
- int cur = 0;
- for (int i = 0; i < 8; i++) {
- int sz = 0;
- while (cur < (int) gen.size() && gen[cur] == 0) sz++, cur++;
- parts[i] = sz;
- cur++;
- }
- bool ok = true;
- for (int i = 0; i < 8; i++) {
- if (parts[i] < 1) ok = false;
- }
- if (!ok) continue;
- if (parts[0] + parts[2] + parts[6] == parts[1] + parts[3] + parts[7]) {
- if (parts[0] + parts[2] + parts[4] == parts[1] + parts[3] + parts[5]) {
- int part[n];
- for (int j = 0; j < n; j++) {
- int tmp = j;
- part[j] = 0;
- while (tmp >= parts[part[j]]) {
- tmp -= parts[part[j]];
- part[j]++;
- }
- }
- cout << 2 << endl;
- int msz = parts[0] + parts[2] + parts[6];
- cout << msz << " ";
- for (int j = 0; j < n; j++)
- if (part[j] == 0 || part[j] == 2 || part[j] == 6) cout << (j + 1) << " ";
- cout << "= ";
- cout << msz << " ";
- for (int j = 0; j < n; j++)
- if (part[j] == 1 || part[j] == 3 || part[j] == 7) cout << (j + 1) << " ";
- cout << endl;
- msz = parts[0] + parts[2] + parts[4];
- cout << msz << " ";
- for (int j = 0; j < n; j++)
- if (part[j] == 0 || part[j] == 2 || part[j] == 4) cout << (j + 1) << " ";
- cout << "= ";
- cout << msz << " ";
- for (int j = 0; j < n; j++)
- if (part[j] == 1 || part[j] == 3 || part[j] == 5) cout << (j + 1) << " ";
- cout << endl;
- return 0;
- }
- }
- }
- return 0;
- }
- if (n % 4 == 3 && a == 4 && b == 3) {
- cout << 4 << endl;
- const int M = 5;
- for (int i = 0; i < 3; i++)
- for (int j = i + 1; j < 3; j++) {
- cout << M << " ";
- for (int k = 0; k < M; k++) {
- cout << (i * M + k + 1) << " ";
- }
- cout << "^ ";
- cout << M << " ";
- for (int k = 0; k < M; k++) {
- cout << (j * M + k + 1) << " ";
- }
- cout << endl;
- }
- int rem = n - M * 3;
- cout << rem / 2 << " ";
- for (int k = 0; k < rem / 2; k++) {
- cout << (M * 3 + k + 1) << " ";
- }
- cout << "^ ";
- cout << rem / 2 << " ";
- for (int k = 0; k < rem / 2; k++) {
- cout << (M * 3 + k + rem / 2 + 1) << " ";
- }
- cout << endl;
- return 0;
- }
- int ng = (n + a - 1) / a;
- for (int i = 0; i < ng; i++) {
- g[i].clear();
- for (int j = 0; j < a; j++) {
- g[i].push_back((i * a + j) % n);
- }
- }
- vector < pair < vector <int>, vector <int> > > ret;
- const int MAX = 1000;
- int EVEN = MAX / 2;
- int ODD = MAX / 2;
- if (a == 1) {
- EVEN = 0;
- ODD = MAX;
- }
- for (int it = 0; it < EVEN; it++) {
- for (int i = 0; i < n; i++) {
- where[i] = 0;
- }
- for (int i = 0; i < n / a; i++) {
- int cnt = rand() % (a / 2 + 1);
- for (int j = 0; j < cnt; j++) {
- for (int put = 1; put <= 2; put++) {
- int x;
- do {
- x = rand() % a;
- } while (where[i * a + x] != 0);
- where[i * a + x] = put;
- }
- }
- }
- for (int i = n / a * a; i < n; i++) {
- where[i] = 0;
- }
- if (n / a * a != n) {
- int c1 = 0, c2 = 0;
- for (int j = 0; j < a; j++) {
- int w = g[ng - 1][j];
- c1 += (where[w] == 1);
- c2 += (where[w] == 2);
- }
- if (c1 != c2) {
- it--;
- continue;
- }
- }
- vector <int> x;
- vector <int> y;
- for (int i = 0; i < n; i++) {
- if (where[i] == 1) {
- x.push_back(i + 1);
- }
- if (where[i] == 2) {
- y.push_back(i + 1);
- }
- }
- if (x.size() <= 1) {
- it--;
- continue;
- }
- ret.push_back(make_pair(x, y));
- }
- for (int it = 0; it < ODD; it++) {
- for (int i = 0; i < n; i++) {
- where[i] = 0;
- }
- for (int i = 0; i < n / a; i++) {
- int cnt1, cnt2;
- do {
- cnt1 = rand() % (a + 1);
- cnt2 = rand() % (a + 1);
- } while (cnt1 == cnt2 || cnt1 + cnt2 > a);
- for (int j = 0; j < cnt1; j++) {
- int x;
- do {
- x = rand() % a;
- } while (where[i * a + x] != 0);
- where[i * a + x] = 1;
- }
- for (int j = 0; j < cnt2; j++) {
- int x;
- do {
- x = rand() % a;
- } while (where[i * a + x] != 0);
- where[i * a + x] = 2;
- }
- }
- for (int i = n / a * a; i < n; i++) {
- where[i] = rand() % 2 + 1;
- }
- if (n / a * a != n) {
- int c1 = 0, c2 = 0;
- for (int j = 0; j < a; j++) {
- int w = g[ng - 1][j];
- c1 += (where[w] == 1);
- c2 += (where[w] == 2);
- }
- if (c1 == c2) {
- it--;
- continue;
- }
- }
- vector <int> x;
- vector <int> y;
- for (int i = 0; i < n; i++) {
- if (where[i] == 1) {
- x.push_back(i + 1);
- }
- if (where[i] == 2) {
- y.push_back(i + 1);
- }
- }
- if (x.size() <= 1 || x.size() != y.size()) {
- it--;
- continue;
- }
- ret.push_back(make_pair(x, y));
- }
- int rsz = ret.size();
- printf("%d\n", rsz);
- for (int i = 0; i < rsz; i++) {
- int sz = ret[i].first.size();
- printf("%d", sz);
- for (int j = 0; j < sz; j++) {
- printf(" %d", ret[i].first[j]);
- }
- printf(" %c ", i >= EVEN ? '^' : '=');
- printf("%d", sz);
- for (int j = 0; j < sz; j++) {
- printf(" %d", ret[i].second[j]);
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement