题目大意:
n个人,坐k辆车,一共坐d天,需要满足任意两个人不是每一天都坐同一趟车。
分析:
第i个人在d天里 要坐的车序号分别是 A1 A2 A3 A4.......Ad
题目只要让任意两个人都不同, 把每一天车的序号看作这个k进制数的一位,把 从小到大的n个k+1进制数输出就好
注意先判断 ,给出k,d 最多能组成的k进制数为 k^d个, 比较k^d与n,如果小于n则不能满足题目,反之可以
注意k非常大。。pow会溢出 得判断pow的溢出 //或者自己模拟乘法,并在过程中判断溢出
例如k为3,也就是4进制 d=4的情况
d天里,每个人在第1、2、3、4天坐的车的序号:
第一个人:1 1 1 1
第二个人:1 1 1 2
第三个人:1 1 1 3
第四个人:1 1 2 1
第五个人:1 1 2 2
第六个人:1 1 2 3
第七个人:1 1 3 1
第八个人:1 1 3 2
第九个人:1 1 3 2
.......
最后输出 把行和列翻转一下输出就可以了
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <cfloat>
#include <queue>
#include <set>
#include <vector>
using namespace std;
__int64 map[1005][1005];
__int64 tm[1005];
int main()
{
__int64 i,j;
__int64 n,k,d;
scanf("%I64d%I64d%I64d",&n,&k,&d);
if (k>=n)
{
for (j=1;j<=d;j++)
{
for (i=1;i<=n;i++)
{
if (i!=1) printf(" ");
printf("%d",i);
}
printf("\n");
}
return 0;
}
double maxx;
if ( _finite( pow((double)k,(int)d) )==0 ) //如果溢出了则置为1000以上的一个数,n最大1000
maxx=1101;
else
maxx=pow((double)k,(int)d);
if (n>maxx)
{
printf("-1\n");
return 0;
}
for (i=1;i< d;i++)
{
tm[i]=1;
}
tm[d]=0;
__int64 pos;
for (i=1;i<=n;i++) //写出k^d个 k进制的数
{
pos=d;
if (tm[pos]<k)
{
tm[pos]++;
}
else
{
__int64 tmp=pos;
tm[pos]++;
while(tm[tmp]>k)
{
tm[tmp]=1;
tmp--;
tm[tmp]++;
}
}
for (j=1;j<=d;j++)
{
map[i][j]=tm[j];
}
}
for (i=1;i<=d;i++)
{
for (j=1;j<=n;j++)
{
if (j!=1) printf(" ");
printf("%I64d",map[j][i]);
}
printf("\n");
}
return 0;
}