示例1:
输入
6
5 20
1 2
1 3
1 4
1 5
3 8
输出
Yes
1 1
2 2
3 3
4 4
5 5
No
No
Yes
1 1
No
Yes
1 1
1 2
2 1
代码:
方法1
#pragma GCC optimize(2)//编译优化
#pragma GCC optimize(3)
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
ll T,n,m,i,j,k,l,o,p,a[10010][10010];
int main()
{
for(scanf("%lld",&T);T--;)
{
scanf("%lld%lld",&n,&m);
if(m&1||m>4*n||n*16>m*m) puts("No");
else
{
puts("Yes");
if (m>2*n+2)
{
o=(m-(2*n+2))/2;p=n-o;
for (i=1;i<=p;i++) printf("1 %lld\n",i);
for (i=1;i<=o;i++) printf("4 %lld\n",i*2);
}
else
{
o=m/4,p=m/2-o;
for(i=1;i<=o;i++) printf("%lld 1\n",i);
for(j=2;j<=p;j++) printf("1 %lld\n",j);
l=n-(o+p-1);
for(i=2;i<=o&&l>0;i++)
for(j=2;j<=p&&l>0;j++,l--)
printf("%lld %lld\n",i,j);
}
}
}
}
方法2(较好理解)
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int t;
cin >> t;
int n, m;
while(t--)
{
cin >> n >> m;
if(m > 4*n || (m&1) || (m*m < 16*n))
{
cout << "No" << endl;
continue;
}
else if(m > 2 * n + 2)
{
cout << "Yes" << endl;
int x = (m-(2*n+2))/2;
int y = n - x;
for(int i = 1; i <= x; i++)
{
cout << "1 " << 2*i << endl;
}
for(int i = 1; i <= y; i++ )
{
cout << "3 " << i << endl;
}
}
else
{
cout << "Yes" << endl;
int x=m/4;
int y=m/2-x;
for(int i = 1; i <= x; i++)
{
cout << i << " 1" << endl;
}
for(int i = 2; i <= y; i++)
{
cout << "1 " << i << endl;
}
int rest=n-(x+y-1);
for(int i=2;i<=x&&rest>0;i++)
for(int j=2;j<=y&&rest>0;j++,rest--)
printf("%d %d\n",i,j);
}
}
return 0;
}