题目链接:http://codeforces.com/contest/459/problem/C
题意:有n个学生,k辆车,n个学生分到k辆车中d次,两个同学d次不能一直在同一辆车里。
分析:很难想,k进制+分治。每次将n平均分成k份,分d次。第一次分成k组,第二次分成k^2组,第三次分成k^3组,最后只要保证k^d > n即可。因为k^d就是长度为d的k进制数的所有情况,对应每一行就有这么多的分类,按列枚举即可。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int tt[1010],cnt,r,ans[1010][1010];
ll n,k,d;
void dfs(int pos)
{
if(pos == d + 1)
{
cnt++;
for(int i = 1; i <= d; i++)
{
ans[i][cnt] = tt[i];
}
// for(int i = 1; i <= d; i++)
// {
// printf("%d ",ans[cnt][i]);
// }
// printf("%d\n",cnt);
return;
}
for(int i = 1; i <= k; i++)
{
tt[pos] = i;
dfs(pos + 1);
if(cnt >= n)break;
}
}
int main()
{
cin>>n>>k>>d;
ll tmp = 1;
for(int i = 1; i <= d; i++)
{
tmp *= k;
if(tmp >= n)break;
}
if(tmp < n){printf("-1\n");return 0;}
dfs(1);
for(int i = 1; i <= d; i++)
{
for(int j = 1; j <= n; j++)
{
if(j == 1)printf("%d",ans[i][j]);
else printf(" %d",ans[i][j]);
}
printf("\n");
}
return 0;
}