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;
}
}