Relatively Prime Graph
题意:定义一个relatively prime graph:每条边的两端点的GCD是1,且图中无自环的连通图;现在给出点的个数n,边的个数m,问能否构建一个relatively prime graph;
图是连通的,m>=n-1;
由1开始找比他大的互质数,直到找到m条;
看上是O(n^2logn)的复杂度,其实不然,如果能找到m条边,就是年找到m对互质数,复杂度远到不了O(n^2logn),n=1000时区间[1, n]中的互质数就大约10000个了;
#include <bits/stdc++.h>
using namespace std;
int gcd(int a, int b){
return b==0?a:gcd(b, a%b);
}
struct node{
int u, v;
}edge[100010];
int main(){
int n, m;
scanf("%d%d", &n, &m);
int e=0;
for(int i=1; i<=n; i++){
for(int j=i+1; j<=n; j++){
if(gcd(i, j)==1){
edge[e].u=i;
edge[e++].v=j;
}
if(e==m) break;
}
if(e==m) break;
}
if(e<m||m<n-1) printf("Impossible\n");
else{
printf("Possible\n");
for(int i=0; i<e; i++){
printf("%d %d\n", edge[i].u, edge[i].v);
}
}
return 0;
}