#include<iostream> #include<vector> using namespace std; int wolny(int a, vector<vector<int>> &Edges) { for(int i=a+1; i<101; i++) if(Edges[i][0]==-1&&Edges[i][1]==-1) if(Edges[i][2]==-1) return i; } int Dzielnik(int n) { for(int i=2; i*i<=n; i++) { if(n%i==0) return i; } return 0; } int Graf(int E, vector<vector<int>> &Edges, int point, int koniec) { int t=E; int temp; int counter = 0; if(E==1) { Edges[point][0]=koniec; return 1; } if(E==2) { Edges[point][0]=koniec; temp = wolny(point, Edges); Edges[point][1]=temp; Edges[temp][0]=koniec; return 2; } while(Dzielnik(E)!=0) { int koniec_temp = wolny(point, Edges); Edges[koniec_temp][2]=0; counter+=Graf(Dzielnik(E), Edges, point, koniec_temp); E/=Dzielnik(E); point=koniec_temp; } if(E==1) { Edges[point][0]=koniec; //N[t]=counter+1; return counter+1; } if(E==2) { temp=wolny(point, Edges); Edges[point][0]=koniec; Edges[point][1]=temp; Edges[temp][0]=koniec; //N[t]=counter+2; return counter+2; } Edges[point][0]=koniec; temp = wolny(point, Edges); Edges[point][1]=temp; point = temp; counter+=Graf(E-1, Edges, point, koniec); point=wolny(point, Edges); counter+=1; //N[t]=counter; return counter; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int k; cin >> k; int point=1; vector<vector<int>> Edges(101, vector<int> (3, -1)); int counter=Graf(k, Edges, point, -2)+1; cout << counter << "\n"; for(int i=1; i<=counter; i++) { if(Edges[i][0]==-2) cout << counter << ' '; else cout << Edges[i][0] << ' '; cout << Edges[i][1] << "\n"; } return 0; }
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 84 85 86 87 88 89 90 91 92 93 94 | #include<iostream> #include<vector> using namespace std; int wolny(int a, vector<vector<int>> &Edges) { for(int i=a+1; i<101; i++) if(Edges[i][0]==-1&&Edges[i][1]==-1) if(Edges[i][2]==-1) return i; } int Dzielnik(int n) { for(int i=2; i*i<=n; i++) { if(n%i==0) return i; } return 0; } int Graf(int E, vector<vector<int>> &Edges, int point, int koniec) { int t=E; int temp; int counter = 0; if(E==1) { Edges[point][0]=koniec; return 1; } if(E==2) { Edges[point][0]=koniec; temp = wolny(point, Edges); Edges[point][1]=temp; Edges[temp][0]=koniec; return 2; } while(Dzielnik(E)!=0) { int koniec_temp = wolny(point, Edges); Edges[koniec_temp][2]=0; counter+=Graf(Dzielnik(E), Edges, point, koniec_temp); E/=Dzielnik(E); point=koniec_temp; } if(E==1) { Edges[point][0]=koniec; //N[t]=counter+1; return counter+1; } if(E==2) { temp=wolny(point, Edges); Edges[point][0]=koniec; Edges[point][1]=temp; Edges[temp][0]=koniec; //N[t]=counter+2; return counter+2; } Edges[point][0]=koniec; temp = wolny(point, Edges); Edges[point][1]=temp; point = temp; counter+=Graf(E-1, Edges, point, koniec); point=wolny(point, Edges); counter+=1; //N[t]=counter; return counter; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int k; cin >> k; int point=1; vector<vector<int>> Edges(101, vector<int> (3, -1)); int counter=Graf(k, Edges, point, -2)+1; cout << counter << "\n"; for(int i=1; i<=counter; i++) { if(Edges[i][0]==-2) cout << counter << ' '; else cout << Edges[i][0] << ' '; cout << Edges[i][1] << "\n"; } return 0; } |