题目描述
给你n根火柴棍,你可以拼出多少个形如“A+B=C”的等式?等式中的A、B、C是用火柴棍拼出的整数(若该数非零,则最高位不能是0)。用火柴棍拼数字0-9的拼法如图所示:

注意:

  1. 加号与等号各自需要两根火柴棍。
  2. 如果A≠B 则 A+B=C 与 B+A=C 视为不同的等式(A,B,C>=0)
  3. n根火柴棍必须全部用上

输入格式
一个整数n(n<=24)。

输出格式
一个整数,能拼成的不同等式的数目。

输入输出样例
输入 14 输出 2
输入 18 输出 9

首先暴力枚举 x 根火柴棒可以组成多少个数字。然后 枚举 三个数字的火柴棒个数,判断即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define sf(n) scanf("%d",&n)
#define pf(n) printf("%d",n)
#define pfc(c) printf(c)
#define fi(i,s,t) for(int i=s;i<t;i++)
#define fd(s,t) for(int i=s-1;i>=t;i--)
#define mem(a,c) memset(a,c,sizeof(a))
const int INF=0x3f3f3f3f;
const int MAX=14000;
int n,a[10]={6,2,5,5,4,5,6,3,7,6};
int c[6]={2,3,4,5,6,7},ans;
int x,y,z,t[21][MAX],cnt[21];
vector<int> v[10];
void init(){
v[2].push_back(1);
v[3].push_back(7);
v[4].push_back(4);
v[5].push_back(2);v[5].push_back(3);v[5].push_back(5);
v[6].push_back(0);v[6].push_back(6);v[6].push_back(9);
v[7].push_back(8);
}
void dfs(int x,int pre,int flag,int a[],int *cnt){
if(x<0) return;
if(x==0) a[(*cnt)++]=pre;
fi(i,0,6){
fi(j,0,v[c[i]].size()){
if(!flag&&v[c[i]][j]==0&&x!=6) continue;
if(!v[c[i]][j])flag=1;
dfs(x-c[i],pre * 10 + v[c[i]][j],flag,a,cnt);
}
}
}
void init_i(){
fi(i,1,21){
dfs(i,0,false,t[i],&cnt[i]);
}
}
int cal(int x){
int cnt=0;
while(x){
cnt +=a[x %10];
x /=10;
}
return cnt;
}
int main(){
freopen("in","r",stdin);
init();init_i();
sf(n);
n-=4;ans =0;
fi(i,1,n+1){
fi(j,1,n+1-i){
int k= n - i -j;
fi(l,0,cnt[i])
fi(m,0,cnt[j]){
int tmp= t[i][l]+t[j][m];
if(cal(tmp)==k)
ans ++;
}
}
}
pf(ans);
return 0;
}