100 可以表示为带分数的形式:100=3+69258714
还可以表示为:100=82+3546197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<106
输入样例1:
输出样例1:
输入样例2:
输出样例2:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int N = 20;
int n; bool st[N], backup[N]; int ans;
bool check(int a, int c) { long long b = n * (long long)c - a * c;
if (!a || !b || !c) return false;
memcpy(backup, st, sizeof st); while (b) { int x = b % 10; b /= 10; if (!x || backup[x]) return false; backup[x] = true; }
for (int i = 1; i <= 9; i++) if (!backup[i]) return false; return true; }
void dfs_c(int u, int a, int c) { if (u == n) return;
if (check(a, c)) ans++;
for (int i = 1; i <= 9; i++) if (!st[i]) { st[i] = true; dfs_c(u + 1, a, c * 10 + i); st[i] = false; } }
void dfs_a(int u, int a) { if (a >= n) return; if (a) dfs_c(u, a, 0);
for (int i = 1; i <= 9; i++) if (!st[i]) { st[i] = true; dfs_a(u + 1, a * 10 + i); st[i] = false; } }
int main() { cin >> n; dfs_a(0, 0); cout << ans << '\n'; return 0; }
|