int n; bool state[N]; // 状态数组,表示每个数字是否被使用 int ans = 0; // 表示最终的方案数 bool backup[N]; // 用于检测b是否符合条件的备份
boolcheck(longlong a, longlong c) { longlong b = n * c - a * c; // 防止越界 if (a == 0 || b == 0 || c == 0) returnfalse; memcpy(backup, state, sizeof(state)); while(b != 0) { int tmp = b % 10; b /= 10; if (tmp == 0 || backup[tmp] == true) returnfalse; // 1到9不能出现0,或者那一位数字已经出现过了,则不符合情况,返回false backup[tmp] = true; } // 判断每个数字是否都出现过,如果存在没有出现过的数字则不符合条件 for (int i = 1; i <= 9; i++) { if (backup[i] == false) returnfalse; } returntrue; }
voiddfs_c(int cur, longlong a, longlong c) { if (cur == n) return; // 数字全部用完则没有b,不符合情况 if (cur > 9)return; // 使用的数字超过9个不符合条件 if (check(a, c)) ans++; for (int i = 1; i <= 9; i++) { if (state[i] == false) { state[i] = true; dfs_c(cur + 1, a, c * 10 + i); state[i] = false; } }
}
voiddfs_a(int cur, longlong a)// 表示当前用了cur个数字,a的值 { if (a >= n) return; // 要保证b和c的存在 if(a!= 0 ) dfs_c(cur, a, 0); // 当前已经使用了cur个数字,a的值,c的值 for (int i = 1; i <= 9; i++) // 枚举a的所有情况 { if (state[i] == false) { state[i] = true; dfs_a(cur + 1, a * 10 + i); state[i] = false; } } } intmain() { cin >> n; dfs_a(0, 0); // 当前已经用了0个数字,a的值是0 cout << ans << endl; return0; }