frac1.cpp

来自「dd牛的usaco源代码!对学习算法」· C++ 代码 · 共 73 行

CPP
73
字号
/*
ID: dd.ener1
PROG: frac1
LANG: C++
*/
#include <cstdio>
using namespace std;

template<class T>
inline void swap(T& l,T& r){
    T tmp=r;
    r=l;
    l=tmp;
}
template<class T>
void qsort(T s1[],long low,long hi){
    if(low>=hi)return;
    T x=s1[(low+hi)/2];
    swap(s1[low],s1[(low+hi)/2]);
    long l=low,r=hi;
    while(l<r){
        while(l<r&&s1[r]>=x)--r;
        s1[l]=s1[r];
        while(l<r&&s1[l]<=x)++l;
        s1[r]=s1[l];
    }
    s1[l]=x;
    qsort(s1,low,l-1);
    qsort(s1,r+1,hi);
}
struct frac{
	long a,b;
	frac():a(0),b(0){}
	frac(long aa,long bb):a(aa),b(bb){}
	bool operator<=(const frac& rhs)const{
		return a*rhs.b<=b*rhs.a;
	}
	bool operator>=(const frac& rhs)const{
		return a*rhs.b>=b*rhs.a;
	}
};
frac* fracs;
long n;
long N;
void input(){
	freopen("frac1.in","r",stdin);
	scanf("%d",&N);
	fracs=new frac[N*N];
}
long gcd(long a,long b){
	if(b==0)return a;
	return gcd(b,a%b);
}
void produce(){
	for(long i=1;i<=N;++i)
		for(long j=1;j<i;++j)
			if(gcd(j,i)==1)
				fracs[n++]=frac(j,i);
	fracs[n++]=frac(0,1);
	fracs[n++]=frac(1,1);
}
void output(){
	freopen("frac1.out","w",stdout);
	for(long i=0;i<n;++i)
		printf("%d/%d\n",fracs[i].a,fracs[i].b);
}
int main(){
	input();
	produce();
	qsort(fracs,0,n-1);
	output();
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?