#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; } |
English