1≤T≤50,1≤n≤105。
| 测试点编号 | n≤ | 特殊性质 |
|---|---|---|
| 1 | 20 | 无 |
| 2 | 50 | 无 |
| 3 | 103 | A |
| 4,5 | 105 | A |
| 6 | 103 | B |
| 7,8 | 105 | B |
| 9 | 103 | 无 |
| 10 | 105 | 无 |
特殊性质 A:保证 n 是 7 的倍数且 n≥100。
特殊性质 B:保证存在整数 k 使得 n=7k+1,且 n≥100。
一个一个累加,遇到的第一个符合条件的数字即为答案
特殊性质 A:保证 n 是 7 的倍数且 n≥100。
输出(n/7)个8,即可获得这部分分(具体分析见下)
特殊性质 B:保证存在整数 k 使得 n=7k+1,且 n≥100。
输出(n/7)−1个8,并在开头加上10即可获得这部分分(具体分析见下)
由特性A,我们不难发现,整个题目应该与7有关,观察火柴棒拼出的数字,发现拼成8所需要的火柴棒数为7且为所有数字中消耗火柴棒最多的数字。
题目要求拼出的数字最小,不难发现,只要数字的位数足够小,则拼出的数字就会最小,为寻求普遍规律,我们可以打表,以下为一个样例代码:
#include<bits/stdc++.h>
using namespace std;
long long a[105];
const int nums[10] = {6,2,5,5,4,5,6,3,7,6};
void change(long long n){
int x = 0;
long long b = n;
while(n){
x += nums[(n%10)];
n /= 10;
}
if(a[x] == 0)a[x] = b;
}
int main(){
for(int i=1;i<=100000000;i++){
change(i);
}
for(int i=1;i<=100;i++){
cout<<i<<" "<<a[i]<<endl;
}
}
/*
本程序实际打表到56
*/
打表结果:
1 0
2 1
3 7
4 4
5 2
6 6
7 8
8 10
9 18
10 22
11 20
12 28
13 68
14 88
15 108
16 188
17 200
18 208
19 288
20 688
21 888
22 1088
23 1888
24 2008
25 2088
26 2888
27 6888
28 8888
29 10888
30 18888
31 20088
32 20888
33 28888
34 68888
35 88888
36 108888
37 188888
38 200888
39 208888
40 288888
41 688888
42 888888
43 1088888
44 1888888
45 2008888
46 2088888
47 2888888
48 6888888
49 8888888
50 10888888
51 18888888
52 20088888
53 20888888
54 28888888
55 68888888
56 88888888
以后的结果均为0(程序复杂度原因,不列入计算行列)
不难发现,从第8行开始,以后的结果都有规律,根据题目提示,我们将所有数字mod 7后,输出,则发现(以下结果从15开始输出):
1 108
2 188
3 200
4 208
5 288
6 688
0 888
1 1088
2 1888
3 2008
4 2088
5 2888
6 6888
0 8888
1 10888
2 18888
3 20088
4 20888
5 28888
6 68888
0 88888
1 108888
2 188888
3 200888
4 208888
5 288888
6 688888
0 888888
1 1088888
2 1888888
3 2008888
4 2088888
5 2888888
6 6888888
0 8888888
1 10888888
2 18888888
3 20088888
4 20888888
5 28888888
6 68888888
0 88888888