1. 程式人生 > >Prime Cryptarithm 牛式

Prime Cryptarithm 牛式

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
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <deque>
#include <map>
using namespace std;
typedef long long ll;
map <ll,ll> mp;
int main()
{
    ll i,j,k,p,q,a,b,c,d,e,n,A,B,C,ans=0;
    ll aa[1010];
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>aa[i];
        mp[aa[i]]=1;
    }
    for(i=0;i<n;i++)
    {
        a=aa[i];
        for(j=0;j<n;j++)
        {
            b=aa[j];
            for(k=0;k<n;k++)
            {
                c=aa[k];
                A=a*100+b*10+c;
                for(p=0;p<n;p++)
                {
                    d=aa[p];
                    for(q=0;q<n;q++)
                    {
                        e=aa[q];
                        B=d*10+e;
                        C=A*B;
                        if(A*e>=100&&A*e<=999)
                        {
                            if(A*d>=100&&A*d<=999)
                            {
                                 if(A*B>=1000&&A*B<=9999)
                                 {
                                     if(mp[A*e%10]&&mp[A*e/10%10]&&mp[A*e/100])
                                     {
                                         if(mp[A*d%10]&&mp[A*d/10%10]&&mp[A*d/100])
                                         {
                                             if(mp[A*B%10]&&mp[A*B/10%10]&&mp[A*B/100%10]&&mp[A*B/1000])
                                                ans++;
                                         }
                                     }
                                 }
                            }

                        }
                    }
                }
            }
        }
    }
    cout<<ans<<endl;
    return 0;
}