给定一个如下乘法算式:
* * *
x * *
-------
* * *
* * *
-------
* * * *
现在,给定 NN 个 1∼91∼9 之间的数字,请你在这些数字中选取合适的数字填入算式,代替 * 号,使得算式成立。
所给的数字可以在算式中出现多次。
算式中不能出现没有给出的数字。
请问,共有多少种不同的填法?
输入格式
第一行包含整数 NN。
第二行包含 NN 个整数,表示给定的数字,数据保证这 NN 个数字互不相同。
输出格式
输出一个整数,表示可以使得算式成立的总填法数量。
数据范围
1≤N≤91≤N≤9
输入样例:
5
2 3 4 6 8
输出样例:
1
样例解释
唯一的使得算式成立的填法如下:
2 2 2
x 2 2
------
4 4 4
4 4 4
---------
4 8 8 4
每个代替 * 号的数字均在给出数字之中,满足条件。
再看一组不满足条件的填法:
2 2 2 <-- OK: 三个数字均在 {2, 3, 4, 6, 8} 之中
x 2 3 <-- OK: 两个数字均在 {2, 3, 4, 6, 8} 之中
------
6 6 6 <-- OK: 三个数字均在 {2, 3, 4, 6, 8} 之中
4 4 4 <-- OK: 三个数字均在 {2, 3, 4, 6, 8} 之中
---------
5 1 0 6 <-- NOT OK: 5,1,0 均不在 {2, 3, 4, 6, 8} 之中
暴力:
枚举两个乘数即可
注意记得判断乘数的位数!
#include <iostream>
using namespace std;
int n,ans;
bool w[10];
bool check(int x,int b){
if(b==3&&x>999){
return 0;
}
if(b==4&&x>9999){
return 0;
}
while(x){
if(!w[x%10]){
return 0;
}
x/=10;
}
return 1;
}
int main () {
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
w[x]=1;
}
for(int i=100;i<1000;i++){
for(int j=10;j<100;j++){
int x=j%10,y=j/10;
if(check(i,3)&&check(j,2)&&check(i*x,3)&&check(i*y,3)&&check(i*j,4)) ans++;
}
}
cout<<ans;
}