Codeforces459 C. Pashmak and Buses(进制表示)

题意:

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/107788020