单点时限: 1.0 sec
内存限制: 512 MB
oxx 和他的小姐姐(们)躺在图书馆前的大草坪上看星星。
有强迫症的 oxx 想要使得他的小姐姐们正好躺成一块 n×m 的长方形。
已知小姐姐的形状是 1×p 的长方形(可以横着或竖着躺)。小姐姐从 1 到 nm 编号总共有 nm 个(如果可以的话,绝对够用)。
P.S. 小姐姐是 1×p 的是因为她们比较苗条。
输入格式
输入三个整数 n, m, p (1≤n,m,p≤100,p 是质数)。
输出格式
如果不行,输出 No。
否则输出 Yes。随后输出 n 行 m 列正整数用空格隔开。同一个小姐姐用相同的数字表示,不同的小姐姐用不同的数字表示。数字应是在 [1,nm] 范围内的正整数。同一个数字至多出现 p 次,这 p 次应该在横向连续,或者纵向连续。
如果有多解输出任意一解。
样例
input
2 3 2
output
Yes
2 2 3
1 1 3
input
3 3 2
output
No
input
3 3 3
output
Yes
2 2 2
1 1 1
3 3 3
input
2 3 2
output
Yes
6 3 3
6 4 4
input
4 2 2
output
Yes
2 7
2 7
5 5
3 3
提示
请注意对于最后一组样例输出:
2 1
2 1
1 2
1 2
是不合法的。因为不同的小姐姐必须用不同的数字表示。你居然把 1 号小姐姐和 2 号小姐姐克隆了 QAQ。
/*
思路:能组成长方形必有一个边是其倍数
*/
#include<iostream>
#include<cstdio>
using namespace std;
int mp[101][101];
int main() {
int n,m,p;
cin>>n>>m>>p;
if(n%p&&m%p)
cout<<"No";
else {
cout<<"Yes"<<endl;
int flag[101][101];
if(n%p==0) {
int index=1;
for(int i=1; i<=m; i++) {
int j =1;
while(j<=n) {
int z=j;
for(; z-j<p; z++) {
flag[z][i]=index;
}
index++;
j=z;
}
}
} else {
int index=1;
for(int i=1; i<=n; i++) {
int j =1;
while(j<=m) {
int z=j;
for(; z-j<p; z++) {
flag[i][z]=index;
}
index++;
j=z;
}
}
}
for(int i =1; i <=n;i++)
{
for(int j =1; j <= m; j++)
cout<<flag[i][j]<<" ";
cout<<endl;
}
}
return 0;
}