题意:给n,m,要求构造一个n个点,m条边的图,要求对于任意一条边<u,v>,gcd(u,v)=1 . 0<n,m<1e5
题解:可以打一下欧拉函数表,发现573内互质的对数就大于1e5了,因此可以从1开始枚举和他互质的点,然后把点对加入vector,当size大于m时就跳出
代码:
#include<bits/stdc++.h>
#define maxn 3000010
using namespace std;
long long res[maxn];
int n, m;
vector<pair<int,int> > p;
int gcd(int a, int b){
return b?gcd(b,a%b):a;
}
long long euler(){
int i,j;
memset(res,0,sizeof(res));
res[1]=1;
for(i=2;i<maxn;++i){
if(!res[i]){
for(j=i;j<maxn;j+=i){
if(!res[j])
res[j]=j;
res[j]=res[j]/i*(i-1);
}
}
}
for(i=2;i<maxn;++i)
res[i]+=res[i-1];
}
int main(){
//euler();
scanf("%d %d", &n, &m);
for(int i = 1; i<=n; i++){
bool flag = true;
for(int j = i+1; j<=n; j++){
if(gcd(i,j)==1) p.push_back(make_pair(i, j));
if(p.size()>=m){
break;
flag = false;
}
}
if(flag == false) break;
}
if(m<n-1 || m>p.size()){
cout<<"Impossible"<<endl;
return 0;
}
else{
cout<<"Possible"<<endl;
vector<pair<int,int> >::iterator it;
it = p.begin();
for(int i = 0; it!=p.end(), i<m; it++, i++){
cout<<(*it).first<<" "<<(*it).second<<endl;
}
}
return 0;
}