双码二部数序列

双码二部数序列

 

Problem Description

双码二部数定义:由两个不同数码组成,每个数码多于1位时相连而不分开的正整数称为双码二部数。其中处于高位相连数字称为高部,处于低位相连数字称为低部。
例如330是一个3位双码二部数:高部数字为3,高部位数为2;低部数字为0,低部位数为1。而333只有一个数码,4407有三个数码,4474的数码4呈分开状态,都不是双码二部数。
试统计n位双码二部数的个数,并求出n位双码二部数从小到大排序的序列第m项。
输入正整数n,m(1<n<10000,1<m<1000000000), 输出n位双码二部数的个数;同时输出n位双码二部数序列的第m项的高部数字(高部位数),低部数字(低部位数),如果m大于n位双码二部数的个数,则输出“0”。

Input

每行2个整数,分别表示n和m

Output

每行2个整数,分别表示n位双码二部数的个数和n位双码二部数从小到大排序的序列第m项。

Sample Input

3 5

Sample Output

162 114

解释:

说实话,这个题目,我看了好久,才明白题目的意思。就是说当一个n位数(123就是三位数),有且只有两个不同的数字(数码)(例123,有三个1,2,3)。这个时候,你要找到,这样的n位数中,有多少个这样的数。并且输出第m个;例如 3位数的,有很多。我只列举一部分的。

100   112 113 114 115 116 117 118 119 122 133 144 155 166 177 188 199 200 211 220 221 223。。。。。

其实呢,对于这样的一组列举,看不出什么东西。我当时是自己列举的4位数。我也列举一下,4位数,开头为4的。

1、4000 4111 4222 4333 (4 444)

2、4400 4411 4422 4433  (44 44)

3、4440 4441 4442 4443 (4444)4445 4446 4447 4448 4449 

4、4455 4466 4477 4488 4499

5、4555 4666 4777 4888 4999

认真的看一下,第1,2行,4,5行,2,4行,1,5行之间的关系,再看1,2,3,4,5行的变化,就可以看到一些规律。

也就是对于一个n位数来说,开头的数字为 t, 那么可以将其分为三个部分。并且只有两个数字,假设为a和b,a和b的个数,分别为lena, lenb。可以发现,长度lenb,是由n-1 到 1 再到n-1的。其中数字变化是,0到t-1,绕后t-1到9.

分为三种变化,分别循环。其中注意,t == 9的时候,然后就是一些小细节的处理,第m个时候要记录一下,全为一样的数的时候,不要记录。总个数小于m的时候。

 1 #include<bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 int main() {
 6     int n, m;
 7     while (cin >> n >> m) {
 8         int a = 1, lena = 1, b = 0, lenb = n - 1;
 9         int ta = 0, t_lena = 0, tb = 0, t_lenb = 0;
10         int sums = 0;
11         
12         for (int i = 1; i <= 9; i++){
13         
14          
15             
16             a = i, lena = 1;
17             for (lenb = n - 1; lenb > 1; lenb--, lena++){
18                 for(b = 0; b < a; b++){
19                     sums++;
20                     if(sums == m){
21                         ta = a, t_lena = lena, tb = b, t_lenb = lenb;    
22                     }
23                 }    
24             }
25             lenb = 1;lena = n-1; 
26             for (b = 0; b < 10; b++){
27                 if(b == a) continue;
28                 sums++;
29                 if(sums == m){
30                     ta = a, t_lena = lena, tb = b, t_lenb = lenb;    
31                 }
32             }
33             
34             lena = n-2;
35             
36             for (lenb = 2; lenb < n; lenb++, lena--){
37                 for (b = a + 1; b < 10; b++){
38                     if(b == a) continue;
39                     sums++;
40                     if(sums == m){
41                         ta = a, t_lena = lena, tb = b, t_lenb = lenb;    
42                     }
43                 }
44             }
45         }
46         printf("%d ", sums);
47 
48         if (sums >= m){
49             for(int t = 0; t < t_lena; t++) {
50                  printf("%d", ta);
51              }
52              for(int t = 0; t < t_lenb; t++){
53                  printf("%d", tb);
54              }
55              printf("\n");
56         }else{
57             printf("0\n");
58         }
59         
60     }
61     return 0;
62 } 
View Code

猜你喜欢

转载自www.cnblogs.com/gznb/p/11207153.html