#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
int a1[33] , a2[11];
int b[11];
int arr[11];
bool judge1(int x) {
while (x) {
if (!b[x % 10]) return 0;
x /= 10;
}
return 1;
}
bool judge2(int x) {
while (x) {
if (!arr[x % 10]) return 0;
x /= 10;
}
return 1;
}
int main() {
int n , cnt = 0 ,tot=1 ,cnt1=0;
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> a1[i];
a2[i] = a1[i];
b[a1[i]] += 1;
arr[i] = 1;
}
//cout << judge(26458) << endl;
for (int i = 111; i <= 999; ++i) {
if (!judge2(i)) continue;
for (int j = 11; j <= 99; ++j) {
if (!judge2(j)) continue;
int x1 = 100 * a1[i/100] + 10 * a1[ (i/10)%10 ] + a1[i%10];
int x2 = 10 * a1[j/10] + a1[j%10];
//cout << x1 << " " << x2 << endl;
int x3 = x1 * (x2 % 10);
int x4 = x1 * (x2 / 10);
int x5 = x1 * x2;
//cout << x3 << " " << x4 << " " << x5 << endl << endl;
if (x3 < 100 || x3>999) continue;
if (!judge1(x3)) continue;
if (x4 < 100 || x4>999) continue;
if (!judge1(x4)) continue;
if (x5 < 1000 || x5>9999) continue;
if (!judge1(x5)) continue;
cnt += 1;
}
}
cout << cnt;
}
这是对于从n个数中取x(x<=n)个数,并且数字可以重复的一种思想。
dfs更可以
五种典型递推关系
1.Fibonacci 数列 Fn = Fn-1 + Fn-2
1.1 兔子繁殖
1.2 爬楼梯
2. Hanoi 塔问题 Hn = 2Hn-1 + 1
3. 平面分割问题 An = An-1 + 2(n-1)
4. Catalan 数
5. 第二类 Striling数