k个颜色,总共的搭配应该是k * (k - 1)
可以证明k * (k - 1)都是可以出现的,即符合题目的4天限制条件
证明如下:
假设k 为 4 , 1为合理搭配, 0 为不合理搭配
1 2 3 4
1 0 1 1 1
2 1 0 1 1
3 1 1 0 1
4 1 1 1 0
即斜着取,斜着取可以保证不会有两个点在同一行与同一列
唯一的特例是k = 2的情况,但是k = 2 的时候 2 2 不是一个合理,所以没问题
这样的话这题只用先判断是否可行,再直接输出即可
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int main()
{
int n, k;
scanf("%d %d", &n, &k);
if(k == 2)
{
if(n > 2)
printf("NO\n");
else
{
printf("YES\n");
if(n == 1)
printf("1 2\n");
else
printf("1 2\n2 1\n");
}
return 0;
}
LL temp = 1LL * k * (k - 1);
if(temp < n)
{
printf("NO\n");
return 0;
}
printf("YES\n");
int t = 2;
while(n)
{
if(n >= k)
{
int te = t;
for(int i = 1; i <= k; i ++)
{
printf("%d %d\n", i, (te > k) ? te % k : te);
te ++;
}
t ++;
n -= k;
}
else
{
int te = t;
for(int i = 1; i <= n; i ++)
{
printf("%d %d\n", i, (te > k) ? te % k : te);
te ++;
}
break;
}
}
return 0;
}