牛式 Prime Cryptarithm
先枚举,
然后判断他们的部分乘积是不是三位数且能不能用n个数中的一个数表示。
再部分乘积相加是否是四位数且能用n个数中的一个数表示。
#include<bits/stdc++.h>
using namespace std;
int n,w[1000],ans=0;
int f(int i){
int s=1;
for(int j=0;j<i;j++) s*=10;
return s;
}
bool check2(int a,int b){
int s=0;
for(int i=0;i<b;i++){
for(int j=0;j<n;j++){
if(a/f(i)%10==w[j]){
s++;
break;
}
}
}
if(s<b) return true;
return false;
}
bool check1(int a,int b) {
int m=b%10,n=b/10%10;
int x=m*a,y=n*a;
int z=x+y*10;
if(x/1000!=0||y/1000!=0||z/10000!=0) return false;
if(check2(x,3)||check2(y,3)||check2(z,4)) return false;
return true;
}
int main() {
cin>>n;
for(int i=0; i<n; i++) cin>>w[i];
for(int i=100; i<=999; i++) {
if(check2(i,3)) continue;
for(int j=10; j<=99; j++) {
if(check2(j,2)) continue;
if(check1(i,j)) ans++;
}
}
cout<<ans;
return 0;
}