USACO 2.1.2 Ordered Fractions
题意:给定正整数N,输出分母小于等于N的“既约真分数”(就是分子分母互质的数)
解法:没发现跟graph有什么关系。。
后面的分析上给出的求解既约真分数的方法
bool rprime(int a, int b){ int r = a % b; while(r != 0){ a = b; b = r; r = a % b; } return(b == 1); }
/* ID: lsswxr1 PROG: frac1 LANG: C++ */ #include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <string> #include <cstring> #include <fstream> using namespace std; #define USACO #ifdef USACO #define cin fin #define cout fout #endif ////////////////////////////////////////////////////////////////////////// ///宏定义 const int INF = 1000000000; const int MAXN = 50001; const int maxn = MAXN; ///全局变量 和 函数 int N; struct node { int up, down; double val; bool operator < (const node& T) const { return val < T.val; } }; node Nodes[maxn]; int main() { #ifndef USACO freopen("D:\\input.txt", "r", stdin); #endif while (cin >> N) { int cnt = 0; Nodes[cnt].up = 0; Nodes[cnt].down = 1; Nodes[cnt].val = 0; cnt++; for (int i = 1; i <= N; i++) { for (int j = 1; j <= i; j++) { if ((i == j) && (i != 1)) continue; bool flag = true; for (int k = 2; k <= j; k++) { if ((i % k ==0) && (j % k ==0)) { flag = false; break; } } if (!flag) continue; Nodes[cnt].up = j; Nodes[cnt].down = i; Nodes[cnt].val = (double)j / (double)i; cnt++; } } sort(Nodes, Nodes + cnt); for (int i = 0; i < cnt; i++) { cout << Nodes[i].up << "/" << Nodes[i].down << endl; } } ///结束 return 0; }