题目
给你n个点m条边,问你是否可以构造出一个图,图里的每一条边相连的两个点的编号的gcd等于1。
n < 1e5
m < 1e5
题解思路
因为m很小,直接考虑暴力,因为我们可以一条一条的建,建满了直接弹出去就行了。
再特判给的边能不能构成图即可。
这题明显白给,就是不敢写。
AC代码
#include <bits/stdc++.h>
//#include <unordered_map>
//priority_queue
#define PII pair<int,int>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 200100;
int n, m ;
int prim[N] ;
int cnt ;
int vis[N] ;
vector <int> head[N] ;
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
cin >> n >> m ;
if ( m < n - 1 )
{
cout << "Impossible\n" ;
return 0 ;
}
for (int i = 1 ; i <= n ; i++ )
{
for (int j = i + 1 ; j <= n ; j++ )
{
if ( __gcd(i , j ) == 1 )
head[i].push_back(j) , m-- ;
if ( m == 0 )
break ;
}
if ( m == 0 )
break ;
}
if ( m )
cout << "Impossible\n" ;
else
{
cout << "Possible\n" ;
for (int i = 1 ; i <= n ; i++ )
{
for (int j = 0 ; j < head[i].size() ; j++ )
cout << i << " " << head[i][j] << "\n";
}
}
return 0 ;
}