题意:
n个人k辆车,d天
要求没有两个人每天都在同一辆车上,输出每天每个人的乘车方案
数据范围:n,d<=1e3,k<=1e9
解法:
每个人每天的乘车方案可以表示为d位k进制数
那么只需要令每个人的数不同即可
d位k进制数一共有k^d种,如果<n则一定无解
否则有解,随便找n个d位k进制数即可
注意:
由于k比较大,k^d用double可能会卡精度(我被卡了一次,然后加了eps,过了)
k等于1的时候,计算1进制数会死循环,特判一下k=1的情况
code:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxm=3e3+5;
int a[maxm][maxm];
int n,k,d;
signed main(){
cin>>n>>k>>d;
if(k==1){//特判k=1
if(n!=1){
cout<<-1<<endl;
}else{
for(int i=1;i<=d;i++){
cout<<1<<endl;
}
}
return 0;
}
double temp=pow(k,d);
if(temp+1e-10<n){
cout<<-1<<endl;
return 0;
}
for(int i=1;i<=n;i++){
int x=i;
int j=0;
while(x){
int t=x%k;
x/=k;
a[i][++j]=t;
}
}
for(int i=1;i<=d;i++){
for(int j=1;j<=n;j++){
cout<<a[j][i]+1<<' ';
}
cout<<endl;
}
return 0;
}