题目
下面是一个乘法竖式,如果用我们给定的那n个数字来取代*,可以使式子成立的话,我们就叫这个式子牛式。
***
x **
***
***
****
(请复制到记事本)
数字只能取代*,当然第一位不能为0,况且给定的数字里不包括0。
注意一下在美国的学校中教的“部分乘积”,第一部分乘积是第二个数的个位和第一个数的积,第二部分乘积是第二个数的十位和第一个数的乘积.
写一个程序找出所有的牛式。
题解
枚举三位的乘数和两位的乘数,然后计算是否合法
代码
/*
ID: yjy_aii1
TASK: crypt1
LANG: C++
*/
#include <cstdio>
using namespace std;
int n,a[11],ans;
bool b[11];
bool ok(int e){
while (e){
if (!b[e%10]) return 1;
e/=10;
}
return 0;
}
void dfs(int d){
if (d>10000){
int c=d/100;d%=100;
if ((d/10*c>=1000)||((d%10)*c>=1000)||(c*d>=10000)) return;
if (ok(d/10*c)||ok((d%10)*c)||ok(c*d)) return;
ans++;
return;
}
for (int i=1;i<=n;i++)
dfs(d*10+a[i]);
}
int main(){
freopen("crypt1.in","r",stdin);
freopen("crypt1.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
b[a[i]]=1;
}
dfs(0);
printf("%d\n",ans);
fclose(stdin);
fclose(stdout);
}