#CSP2024J2T3. 小木棍

[返回题解]


题目速览

题目描述

小 S 喜欢收集小木棍。在收集了 nn 根长度相等的小木棍之后,他闲来无事,便用它们拼起了数字。用小木棍拼每种数字的方法如下图所示。

现在小 S 希望拼出一个正整数,满足如下条件:

  • 拼出这个数恰好使用 nn 根小木棍;
  • 拼出的数没有前导 00;
  • 在满足以上两个条件的前提下,这个数尽可能小。

小 S 想知道这个数是多少,可 nn 很大,把木棍整理清楚就把小 S 折腾坏了,所以你需要帮他解决这个问题。如果不存在正整数满足以上条件,你需要输出 −1-1 进行报告。

输入格式

本题有多组测试数据。

输入的第一行包含一个正整数 TT,表示数据组数。

接下来包含 TT 组数据,每组数据的格式如下:

一行包含一个整数 nn,表示木棍数。

输出格式

对于每组数据:输出一行,如果存在满足题意的正整数,输出这个数;否则输出 −1-1。

输入输出样例 #1

输入 #1

5
1
2
3
6
18

输出 #1

-1
1
7
6
208

说明/提示

【样例 1 解释】

  • 对于第一组测试数据,不存在任何一个正整数可以使用恰好一根小木棍摆出,故输出 −1-1。
  • 对于第四组测试数据,注意 00 并不是一个满足要求的方案。摆出 99、4141 以及 111111 都恰好需要 66 根小木棍,但它们不是摆出的数最小的方案。
  • 对于第五组测试数据,摆出 208208 需要 5+6+7=185 + 6 + 7 = 18 根小木棍。可以证明摆出任何一个小于 208208 的正整数需要的小木棍数都不是 1818。注意尽管拼出 006006 也需要 1818 根小木棍,但因为这个数有前导零,因此并不是一个满足要求的方案。

【数据范围】

对于所有测试数据,保证:1≤T≤501 \leq T \leq 50,1≤n≤1051 \leq n \leq 10^5。

测试点编号 n≤n\leq 特殊性质
11 2020 无
22 5050
33 10310^3 A
4,54,5 10510^5
66 10310^3 B
7,87,8 10510^5
99 10310^3 无
1010 10510^5

特殊性质 A:保证 nn 是 77 的倍数且 n≥100n \geq 100。

特殊性质 B:保证存在整数 kk 使得 n=7k+1n = 7k + 1,且 n≥100n \geq 100。


一道普及的题

这题找规律就行了。

先看看题目给的关键信息:

特殊性质 A:保证 nn 是 77 的倍数且 n≥100n \geq 100。

特殊性质 B:保证存在整数 kk 使得 n=7k+1n = 7k + 1,且 n≥100n \geq 100。

⬆这里提示的很明显了,小棍木拼成最大数字就和7的倍数有关系

下面是测试数据及其答案,从中找规律。

样例下载 答案下载

测试数据:对应答案
6:6
18:208
13:68
1:-1
14:88
20:688
5:2
17:200
7:8
12:28
8:10
3:7
15:108
9:18
10:22
4:4
19:288
16:188
11:20
2:1

不难看出,我们只需要分类讨论nn%7=07=0~66的情况就好了

11~77、1818、1010的情况建议特例。[11的情况为−1-1]

先打一个数字11~77所需小木棍数量的表。

int s[15]{6,2,5,5,4,5,6,3,7,6};

然后再按规律输出(以下为分析过程)。

分析过程

[][]内文字对应上面样例输出

余数为00:输出n/7n/7个88 :[7:8、14:88][7:8、14:88].

余数为11:先输出1010,输出(n/7)−1(n/7)-1个88 :[8:10、15:108][8:10、15:108].

余数为22:先输出11,输出n/7n/7个88 :[9:18、16:188][9:18、16:188].

余数为33:先输出200200,输出(n/7)−2(n/7)-2个88 :[17:200][17:200].

余数为44:先输出2020,输出(n/7)−1(n/7)-1个88 :[11:20、18:208][11:20、18:208].

余数为55:先输出22,输出n/7n/7个88 :[5:2、12:28、19:288][5:2、12:28、19:288].

余数为66:先输出66,输出n/7n/7个88 :[6:6、13:68、20:688][6:6、13:68、20:688].

同时注意有多组测试数据哦。

代码部分
#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll T,n,s[15]{6,2,5,5,4,5,6,3,7,6};
int main(){
	cin>>T;
	while(T--){
		cin>>n;
		if(n==1){
			cout<<-1<<endl;
			continue;
		}
		if(n==18){
			cout<<208<<endl;
			continue;
		}
		if(n==10){
			cout<<22<<endl;
			continue;
		}
		if(n<=7){
			for(int i=1;i<=22;i++){
				if(s[i]==n){
					cout<<i<<endl;
					break;
				}
			}
			continue;
		}
		if(n%7==0){
			for(int i=1;i<=n/7;i++) cout<<8;
			cout<<endl;
			continue;
		}
		if(n%7==1){
			cout<<10;
			for(int i=1;i<=(n/7)-1;i++) cout<<8;
			cout<<endl;
			continue;
		}
		if(n%7==2){
			cout<<1;
			for(int i=1;i<=n/7;i++) cout<<8;
			cout<<endl;
			continue;
		}
		if(n%7==3){
			cout<<200;
			for(int i=1;i<=(n/7)-2;i++) cout<<8;
			cout<<endl;
			continue;
		}
		if(n%7==4){
			cout<<20;
			for(int i=1;i<=(n/7)-1;i++) cout<<8;
			cout<<endl;
			continue;
		}
		if(n%7==5){
			cout<<2;
			for(int i=1;i<=n/7;i++) cout<<8;
			cout<<endl;
			continue;
		}
		if(n%7==6){
			cout<<6;
			for(int i=1;i<=n/7;i++) cout<<8;
			cout<<endl;
			continue;
		}
	}
	
	return 0;
}
//fish code