備戰Noip2018模擬賽10(B組) T4 Alpha2 蟲食算
阿新 • • 發佈:2018-12-16
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; }