题目链接: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; }
