[题解]CQOI2012 T1 编号 number
编号 number
【题目描述】
你需要给一批商品编号,其中每个编号都是一个7位16进制数(由0~9,a~f组成)。为了防止在人工处理时不小心把编号弄错,要求任意两个编号至少由三个位置对应的数字不相同。第一个编号为0000000,第二个编号为不违反上述规定的前提下最小的编号,……,每次分配一个新编号时,总是选择不和前面编号冲突的最小编号(注意编号都是16进制数,可以比较大小)。按此规律,前面若干编号分别是:0000000,0000111,0000222,……,0000fff,0001012,0001103,0001230,0001321,0001456,……
输入k,你的任务时求出第k小的编号。
【输入】
第一行为整数k。
【输出】
输出第k小的编号(字母必须输出小写)。输入保证这个编号存在。
【样例】
number.in
20
number.out
0001321
【数据规模】
1-3数据点:k<=200
4-7数据点:k<=10000
8-10数据点:k<=200000
---------------------------------------------------------------------------------------------------------------------------------------------------
【题解】
今天做了去年的重庆省选题,第二次做还是跪了。(虽说去年lz是个猹。。)感冒了,调不出来程序,顺便就写个简单的题解吧。下面进入正题。。。
一道很简单的数位排列问题。本题是一个7位的16进制数排列,但可以简化为五维。
题目中说至少有三位不相同,那么可以确定两个不相同数位。如果两个数位的位置不同,那么即使其它五个数都相同,也至少有三位不同。
废话不多说,直接上代码。。
1 /*
2 PROG:bzoj1805
3 ID:waiting
4 TYPE:数学
5 POINT:
6 {
7 排列组合。
8 本题是一个7位的16进制数排列,但可以简化为五位。
9 题目中说至少有三位不相同,那么可以确定两个不相同数位。如果两个数位的位置不同,那么即使其它五个数都相同,也至少有三位不同。
10 以下表示出排列:
11 --00000
12 -0-0000
13 -00-000
14 -000-00
15 -0000-0
16 -00000-
17 0--0000
18 0-0-000
19 0-00-00
20 0-000-0
21 0-0000-
22 00--000
23 00-0-00
24 00-00-0
25 00-000-
26 000--00
27 000-0-0
28 000-00-
29 0000--0
30 0000-0-
31 00000--
32 ('0'表示可以相同的数字,'-'表示不同位)
33 根据排列组合C(7,2)=21,共有21种排列。
34 规定:a[i][a1][a2][a3][a4][a5]为第i种排列方式下除去不同位后剩下的五个数位分别a1、a2、a3、a4、a5。
35 }
36 */
37 #include<iostream>
38 #include<cstdio>
39 using namespace std;
40 #define MAXN 20
41 int k;
42 bool a[30][MAXN][MAXN][MAXN][MAXN][MAXN];
43 int main()
44 {
45 scanf("%d",&k);
46 int a1,a2,a3,a4,a5,a6,a7;
47 for(a1=0;a1<=15;a1++)
48 for(a2=0;a2<=15;a2++)
49 for(a3=0;a3<=15;a3++)
50 for(a4=0;a4<=15;a4++)
51 for(a5=0;a5<=15;a5++)
52 for(a6=0;a6<=15;a6++)
53 for(a7=0;a7<=15;a7++)
54 {
55 if(!a[0][a3][a4][a5][a6][a7]
56 &&!a[1][a2][a4][a5][a6][a7]
57 &&!a[2][a2][a3][a5][a6][a7]
58 &&!a[3][a2][a3][a4][a6][a7]
59 &&!a[4][a2][a3][a4][a5][a7]
60 &&!a[5][a2][a3][a4][a5][a6]
61 &&!a[6][a1][a4][a5][a6][a7]
62 &&!a[7][a1][a3][a5][a6][a7]
63 &&!a[8][a1][a3][a4][a6][a7]
64 &&!a[9][a1][a3][a4][a5][a7]
65 &&!a[10][a1][a3][a4][a5][a6]
66 &&!a[11][a1][a2][a5][a6][a7]
67 &&!a[12][a1][a2][a4][a6][a7]
68 &&!a[13][a1][a2][a4][a5][a7]
69 &&!a[14][a1][a2][a4][a5][a6]
70 &&!a[15][a1][a2][a3][a6][a7]
71 &&!a[16][a1][a2][a3][a5][a7]
72 &&!a[17][a1][a2][a3][a5][a6]
73 &&!a[18][a1][a2][a3][a4][a7]
74 &&!a[19][a1][a2][a3][a4][a6]
75 &&!a[20][a1][a2][a3][a4][a5])
76 {
77 k--;
78 if(!k)
79 {
80 printf("%x%x%x%x%x%x%x\n",a1,a2,a3,a4,a5,a6,a7);
81 return 0;
82 }
83 a[0][a3][a4][a5][a6][a7]=true;
84 a[1][a2][a4][a5][a6][a7]=true;
85 a[2][a2][a3][a5][a6][a7]=true;
86 a[3][a2][a3][a4][a6][a7]=true;
87 a[4][a2][a3][a4][a5][a7]=true;
88 a[5][a2][a3][a4][a5][a6]=true;
89 a[6][a1][a4][a5][a6][a7]=true;
90 a[7][a1][a3][a5][a6][a7]=true;
91 a[8][a1][a3][a4][a6][a7]=true;
92 a[9][a1][a3][a4][a5][a7]=true;
93 a[10][a1][a3][a4][a5][a6]=true;
94 a[11][a1][a2][a5][a6][a7]=true;
95 a[12][a1][a2][a4][a6][a7]=true;
96 a[13][a1][a2][a4][a5][a7]=true;
97 a[14][a1][a2][a4][a5][a6]=true;
98 a[15][a1][a2][a3][a6][a7]=true;
99 a[16][a1][a2][a3][a5][a7]=true;
100 a[17][a1][a2][a3][a5][a6]=true;
101 a[18][a1][a2][a3][a4][a7]=true;
102 a[19][a1][a2][a3][a4][a6]=true;
103 a[20][a1][a2][a3][a4][a5]=true;
104 }
105 }
106 return 0;
107 }
写得有点冗余,当时直接写了个小程序打出来的>_< 实在不想手码。。