CodeForces 459C-G - Pashmak and Buses-构造-K进制


题目大意:

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


你可能感兴趣的:(CodeForces 459C-G - Pashmak and Buses-构造-K进制)