10月20日备战Noip2018模拟赛10
T4 Alpha2虫食算
题目描述
粗心的小明把墨水泼在了乘法算式上,由于他实在是太弱了,不知道怎么办,所以请了巨佬PYZ,PYZ看了一眼就说,我不仅可以求出来,我还可以求出很多个解。
下面是一个乘法算式,但是所有的数字都看不见了。
* * *
X * *
-----------
* * *
* * *
-----------
* * * *
如果一个“*”可以是任何一个数字,想必这个虫食算有相当多的解;但如果一个“*”只能从给定集合中选取数字,那么这个虫食算有多少个解呢?
输入格式
第一行有一个正整数N,代表可选数字的个数。
第二行有Ñ个用空格隔开的数字,这些数字只能是1到9中的一个,并且它们互不相同。这些数字表示一个*可以代表的数字。
输出格式
一行一个整数,总的方案数。
输入样例
5
2 3 4 6 8
输出样例
1
样例解释
下面显示了该虫食算满足样例输入条件的唯一解。
2 2 2
x 2 2
------
4 4 4
4 4 4
---------
4 8 8 4
数据范围
50%数据:n <= 5; 100%数据:n <= 9
思路
暴力!
一个个列举所有可能的数,再判断是否合法。
代码
#include <iostream>
#include <cstdio>
using namespace std;
int n, x, x1, x2, x3, x4, cnt;
bool b[10];
bool isAvailable (int x) //这个函数用来判断所选数的每一个数字是否在输入的数组中
{
x1 = x % 10 / 1;
x2 = x % 100 / 10;
x3 = x % 1000 / 100;
x4 = x % 10000 / 1000;
if (x < 100){
if (!b[x1] || !b[x2]) return false;
}
else if (x >= 100 && x < 1000){
if (!b[x1] || !b[x2] || !b[x3]) return false;
}
else{
if (!b[x1] || !b[x2] || !b[x3] || !b[x4]) return false;
}
return true;
}
int main ()
{
//freopen ("alpha2.in", "r", stdin);
//freopen ("alpha2.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i ++){
cin >> x;
b[x] = 1;
}
cnt = 0;
for (int i = 100; i < 1000; i ++){
if (! isAvailable (i)) continue; //这个数的每一位都合法
for (int j = 10; j < 100; j ++){
if (! isAvailable (j)) continue; //这个数的每一位都合法
if (i * j >= 10000) continue; //这个数是四位数
if (i * (j % 10) >= 1000) continue; //三位数
if (i * (j / 10) >= 1000) continue; //三位数
if (! isAvailable (i * (j % 10))) continue;
if (! isAvailable (i * (j / 10))) continue;
if (! isAvailable (i * j)) continue;
cnt ++;
}
}
cout << cnt;
//fclose (stdin);
//fclose (stdout);
return 0;
}