codeforces Round #261(div2) C解題報告

C. Pashmak and Buses
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

Recently Pashmak has been employed in a transportation company. The company has k buses and has a contract with a school which hasn students. The school planned to take the students to d different places for d days (each day in one place). Each day the company provides all the buses for the trip. Pashmak has to arrange the students in the buses. He wants to arrange the students in a way that no two students become close friends. In his ridiculous idea, two students will become close friends if and only if they are in the same buses for alld days.

Please help Pashmak with his weird idea. Assume that each bus has an unlimited capacity.

Input

The first line of input contains three space-separated integers n, k, d (1 ≤ n, d ≤ 1000; 1 ≤ k ≤ 109).

Output

If there is no valid arrangement just print -1. Otherwise print d lines, in each of them print n integers. The j-th integer of the i-th line shows which bus the j-th student has to take on the i-th day. You can assume that the buses are numbered from 1 to k.

Sample test(s)
input
3 2 2
output
1 1 2 
1 2 1 
input
3 2 1
output
-1
Note

Note that two students become close friends only if they share a bus each day. But the bus they share can differ from day to day.

題目大意:

       n個人,k個公交,出去遊玩d天,每天每個人可以選擇任意一輛公交乘坐,最後要你求每天每個人選擇的公交併輸出,要求所有的d天中,不能至少有兩個人一直在同一輛公交上。

解法:

把這題抽象一下,每個人,在1~K個數中選數字,組成d長度的序列,要求每個序列不能完全相同,數字可以重複選。

進一步抽象一下,每個人的乘坐公交的序列,就是d位k進制數,最多可以分配的序列個數爲 k^d。如若 n <= k^d,則從0(k進制),每次+1輸出,反之沒有答案。

舉個例子進一步說說明:

       n = 8, k = 3, d = 4。 這裏的0表示標記爲1的公交,1爲標記爲2的公交,以此類推

       第一個人的序列:  0, 0, 0, 0

       第二個人的序列:  0, 0, 0, 1

       第三個人的序列:  0, 0, 0, 2

       第四個人的序列:  0, 0, 1, 0

       第五個人的序列:  0, 0, 1, 1

       第六個人的序列:  0, 0, 1, 2

       第七個人的序列:  0, 0, 2, 0

       第八個人的序列:  0, 0, 2, 1

代碼:

#include <cstdio>
#include <iostream>
#define LL long long
#define N_max 1234

using namespace std;

int d, n, k;
int f[N_max][N_max];

void init() {
	cin >> n >> k >> d;
}

bool check() {
	LL cnt=1;

	for (int i = 1; i <= d; i++) {
		cnt *= k;

		if (n <= cnt)
			return true;
	}

	return false;
}

void solve() {
	if (check()) {
		for (int i = 2; i <= n; i++) {
			int tmp=0;

			f[i][1] = 1;
			for (int j = 1; j <= d; j++) {
				f[i][j] = f[i-1][j] + f[i][j] + tmp;

				if (f[i][j] >= k) {
					f[i][j] -= k;
					tmp = 1;
				}
				else
					tmp = 0;
			}
		}

		for (int j = 1; j <= d; j++) {
			for (int i = 1; i <= n; i++)
				printf("%d ", f[i][j]+1);

			printf("\n");
		}
	}
	else
		printf("-1\n");
}

int main() {
	init();
	solve();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章