#include <bits/stdc++.h> using namespace std; vector<int> graph[100]; vector<int> dostepne; vector<int> niedostepne; int k, liczba, liczba1; int drogi[100]; int policz_drogi() { drogi[99] = 1; drogi[98] = 1; for (int i = 97; i >= 0; --i) { if (graph[i].size() == 2) drogi[i] = drogi[i + 1] + drogi[graph[i][1]]; else drogi[i] = drogi[i + 1]; } return drogi[0]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); srand(time(0)); cin >> k; int wynik = 0; for (int i = 0; i < 98; ++i) { graph[i].push_back(i + 1); dostepne.push_back(i); } graph[98].push_back(99); wynik = policz_drogi(); while (wynik != k) { if (!dostepne.size() && wynik < k) { for (int i = 0; i < 98; ++i) { graph[i].pop_back(); dostepne.push_back(i); niedostepne.pop_back(); } } else if (wynik > k) { liczba = rand() % (niedostepne.size()); swap(niedostepne[liczba], niedostepne[niedostepne.size() - 1]); liczba = niedostepne[niedostepne.size() - 1]; dostepne.push_back(liczba); niedostepne.pop_back(); graph[liczba].pop_back(); wynik = policz_drogi(); } else { liczba = rand() % (dostepne.size()); //losuje ze wszystkich dostepnych swap(dostepne[liczba], dostepne[dostepne.size() - 1]); liczba = dostepne[dostepne.size() - 1]; // let liczba bedzie rowna liczbie pod indeksem, ktory zostal wylosowany dostepne.pop_back(); //cout << "liczba = " << liczba << endl; liczba1 = rand() % (100 - liczba - 2) + liczba + 2; // SIGFPE!!!!!!!!!!!!! graph[liczba].push_back(liczba1); //dodaje polaczenie niedostepne.push_back(liczba); wynik = policz_drogi(); } //cout << "Wynik = " << wynik << endl; } cout << 100 << '\n'; for (int i = 0; i < 99; ++i) { if (graph[i].size() == 2) cout << graph[i][0] + 1 << " " << graph[i][1] + 1 << '\n'; else { cout << graph[i][0] + 1 << " " << -1 << '\n'; } } cout << -1 << " " << -1; }
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 73 74 75 76 77 78 79 80 81 82 83 | #include <bits/stdc++.h> using namespace std; vector<int> graph[100]; vector<int> dostepne; vector<int> niedostepne; int k, liczba, liczba1; int drogi[100]; int policz_drogi() { drogi[99] = 1; drogi[98] = 1; for (int i = 97; i >= 0; --i) { if (graph[i].size() == 2) drogi[i] = drogi[i + 1] + drogi[graph[i][1]]; else drogi[i] = drogi[i + 1]; } return drogi[0]; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); srand(time(0)); cin >> k; int wynik = 0; for (int i = 0; i < 98; ++i) { graph[i].push_back(i + 1); dostepne.push_back(i); } graph[98].push_back(99); wynik = policz_drogi(); while (wynik != k) { if (!dostepne.size() && wynik < k) { for (int i = 0; i < 98; ++i) { graph[i].pop_back(); dostepne.push_back(i); niedostepne.pop_back(); } } else if (wynik > k) { liczba = rand() % (niedostepne.size()); swap(niedostepne[liczba], niedostepne[niedostepne.size() - 1]); liczba = niedostepne[niedostepne.size() - 1]; dostepne.push_back(liczba); niedostepne.pop_back(); graph[liczba].pop_back(); wynik = policz_drogi(); } else { liczba = rand() % (dostepne.size()); //losuje ze wszystkich dostepnych swap(dostepne[liczba], dostepne[dostepne.size() - 1]); liczba = dostepne[dostepne.size() - 1]; // let liczba bedzie rowna liczbie pod indeksem, ktory zostal wylosowany dostepne.pop_back(); //cout << "liczba = " << liczba << endl; liczba1 = rand() % (100 - liczba - 2) + liczba + 2; // SIGFPE!!!!!!!!!!!!! graph[liczba].push_back(liczba1); //dodaje polaczenie niedostepne.push_back(liczba); wynik = policz_drogi(); } //cout << "Wynik = " << wynik << endl; } cout << 100 << '\n'; for (int i = 0; i < 99; ++i) { if (graph[i].size() == 2) cout << graph[i][0] + 1 << " " << graph[i][1] + 1 << '\n'; else { cout << graph[i][0] + 1 << " " << -1 << '\n'; } } cout << -1 << " " << -1; } |