100 可以表示为带分数的形式:100=3+69258714
还可以表示为:100=82+3546197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
1、数据范围:10^6 这是虚假的数据,因为要计算的应该是1-9
所以 9! = 326880;
2、先把9个数全排列,然后分成3个部分 计算是否符合题意
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
int n;
int state[10], g[10], cnt;
int change(int a, int b)
{
int sum = 0, ch = 1;
for (int i = a; i <= b; i++)
{
sum += g[i] * ch;
ch *= 10;
}
return sum;
}
void dfs(int u)
{
if (u == 9) //列举完成
{
for (int i = 0; i < 7; i++)
for (int j = i + 1; j < 8; j++)
{
int a = change(0, i);
int b = change(i + 1, j);
int c = change(j + 1, 8);
if (a * c + b == n * c)
cnt++;
}
}
for (int i = 0; i < 9; i++)
{
if (state[i] == 0)
{
state[i] = 1;
g[u] = i + 1;
dfs(u + 1);
g[u] = 0;
state[i] = 0;
}
}
}
int main()
{
cin >> n;
dfs(0);
cout << cnt << endl;
return 0;
}