题目链接:
题意:
整数n,m;
有n个整数标号为1~ n;
求是否存在m个对使得gcd(a,b)= 1(1<=a<=n,1<=b<=n,a!=b);
思路:
暴力呗,暴力出奇迹啊~
因为n,m的范围是<=1e5,所以应该不会T吧......
枚举gcd(a,b)=1的用两个数组分别存起来,如果已经到了m个,就不用再找了,break,输出possible,依次输出两个数组的值;
如果枚举完全部的,还不到m个,就输出impossible;
AC代码如下:
#include <cstdio>
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
int gcd(int m,int n)//求最大公约数
{
if(n==0)
{
return m;
}
else
{
return gcd(n,m%n);
}
}
int main()
{
int n,k,sum=0,ok=0,num=0;
scanf("%d%d",&n,&k);
int a[100001],b[100001];
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if(gcd(i,j)==1)
{
sum++;
a[num]=i;
b[num]=j;
num++;
}
if(sum==k)
{
ok=1;
break;
}
}
if(ok)
{
break;
}
}
if(ok==0||n-1>k)
{
printf("Impossible\n");
}
else
{
printf("Possible\n");
for(int i=0;i<num;i++)
{
printf("%d %d\n",a[i],b[i]);
}
}
}