Description
我们将一个无向图称作互质图,当且仅当对于其中每一条边 ((v, u)) 有 (v) 和 (u) 互质(也即 (GCD(v,u)=1))。当两个顶点之间没有边时不需要考虑。顶点从 (1) 开始标号。
现在给你 (n) 个顶点和 (m) 条边,要求你建立一个无重边和自环并且连通的互质图,或者判定无法构造。
Solution
设将每条边描述为 ((u,v)),满足 (u<v),那么我们从小到大枚举 (u),再从小到大枚举 (v),能连就连
复杂度与 (varphi) 函数的前缀和有关,不妨将其视作 (O(n log n))
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1000005;
int n,m;
vector <pair<int,int> > out;
signed main() {
ios::sync_with_stdio(false);
cin>>n>>m;
for(int i=1;i<=n;i++) {
if(out.size()>m) continue;
for(int j=i+1;j<=n;j++) {
if(out.size()>m) continue;
if(__gcd(i,j)==1) {
out.push_back({i,j});
}
}
}
if(out.size()<m || n>m+1) {
cout<<"Impossible";
}
else {
cout<<"Possible"<<endl;
for(int i=0;i<m;i++) cout<<out[i].first<<" "<<out[i].second<<endl;
}
}