Description

 

下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。

* * *
x * *
-------
* * *
* * *
-------
* * * *


数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0。

注意一下在美国的学校中教的“部分乘积”,第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积.

写一个程序找出所有的牛式。

 

Input

 

Line 1:数字的个数n。 Line 2:N个用空格分开的数字(每个数字都∈ {1,2,3,4,5,6,7,8,9})。

 

Output

 

共一行,一个数字。表示牛式的总数。
下面是样例的那个牛式。

2 2 2
x 2 2
---------
4 4 4
4 4 4
---------
4 8 8 4


 

Sample Input

5
2 3 4 6 8


Sample Output

1


解题思路:纯粹的暴力枚举一下即可,不过为了提高代码效率,我们可以将查找判断该数的组成数是否给定集合写成一个函数。


 



1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<algorithm>
5 using namespace std;
6 int vis[10];
7 int judge(int x)
8 {
9 int k;
10 while(x)
11 {
12 k=x%10;
13 if(!vis[k])
14 {
15 return 0;
16 }
17 x=x/10;
18 }
19 return 1;
20 }
21 int main()
22 {
23 int n,i,j,x,y,counts,a;
24 scanf("%d",&n);
25 memset(vis,0,sizeof(vis));
26 for(i=0; i<n; i++)
27 {
28 scanf("%d",&a);
29 vis[a]=1;///记录可以出现的数
30 }
31 counts=0;
32 for(i=100; i<=999; i++)///牛式第一行
33 {
34 if(judge(i))
35 {
36 for(j=10; j<=99; j++)///牛式第二行
37 {
38 if(judge(j))
39 {
40 if(i*j>9999)
41 {
42 continue;
43 }
44 x=j/10;
45 y=j%10;///牛式三四行
46 if(x*i>999||y*i>999)
47 {
48 continue;
49 }
50 if(judge(i*j)&&judge(x*i)&&judge(y*i))///牛式第五行
51 {
52 counts++;
53 }
54 }
55 }
56 }
57 }
58 printf("%d\n",counts);
59 return 0;
60 }