Prime Cryptarithm 牛式
阿新 • • 發佈:2018-12-10
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; }