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

相关文章: