toj 2798 Farey Sequence
The Farey Sequence Fn for any integer n with n ≥ 2 is the set of irreducible rational numbers a/b with 0 < a < b ≤ n and gcd(a,b) = 1 arranged in increasing order. The first few are
F2 = {1/2}
F3 = {1/3, 1/2, 2/3}
F4 = {1/4, 1/3, 1/2, 2/3, 3/4}
F5 = {1/5, 1/4, 1/3, 2/5, 1/2, 3/5, 2/3, 3/4, 4/5}
Now, your task is to print Farey Sequence given the value of n.
Input
There are several test cases. The first line is an integer giving the number of cases. Each test case has only one line, which contains a positive integer n.Output
For each test case, you should output one line, which contains the corresponding Farey Sequence. Adjacent terms are separated by a single ',' and there can't be any white spaces in your output. See Sample Output for more clarifications on the output format.Constraints
2 ≤ n ≤ 3000Sample Input
4 2 3 4 5
Sample Output
1/2 1/3,1/2,2/3 1/4,1/3,1/2,2/3,3/4 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5
Note
Do Not use cout to produce the output for this problem, since it is inefficient.
Source: The 5th UESTC Programming Contest
Problem ID in problemset: 2798
#include <iostream>
#include <queue>
using namespace std;
int t,n;
typedef struct node
{
short a,b;
float c;
node(){}
node(short aa,short bb,float cc)
{
a=aa;
b=bb;
c=cc;
}
friend bool operator <(node x,node y)
{
return x.c>y.c;
}
}Point;
priority_queue<Point>Q;
Point p;
int gcd (short a , short b)
{
if (b == 0)
return a;
return gcd (b , a % b);
}
int main()
{
short i,j;
scanf("%d",&t);
// int num = 0;
while(t--)
{
scanf("%d",&n);
printf("1/%d",n);
while(!Q.empty())
Q.pop();
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
{
if(i==1&&j==n)
continue;
if(gcd(i,j)==1)
{
Q.push(node(i,j,i*1.0/j));
// num ++;
}
}
while(!Q.empty())
{
p=Q.top();
Q.pop();
printf(",%d/%d",p.a,p.b);
}
//cout<<num<<endl;
printf("\n");
}
return 0;
}
#include <queue>
using namespace std;
int t,n;
typedef struct node
{
short a,b;
float c;
node(){}
node(short aa,short bb,float cc)
{
a=aa;
b=bb;
c=cc;
}
friend bool operator <(node x,node y)
{
return x.c>y.c;
}
}Point;
priority_queue<Point>Q;
Point p;
int gcd (short a , short b)
{
if (b == 0)
return a;
return gcd (b , a % b);
}
int main()
{
short i,j;
scanf("%d",&t);
// int num = 0;
while(t--)
{
scanf("%d",&n);
printf("1/%d",n);
while(!Q.empty())
Q.pop();
for(i=1;i<=n-1;i++)
for(j=i+1;j<=n;j++)
{
if(i==1&&j==n)
continue;
if(gcd(i,j)==1)
{
Q.push(node(i,j,i*1.0/j));
// num ++;
}
}
while(!Q.empty())
{
p=Q.top();
Q.pop();
printf(",%d/%d",p.a,p.b);
}
//cout<<num<<endl;
printf("\n");
}
return 0;
}