题目描述
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
C ++代码
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 10;//N最大为1e6, 即N最多为7位
int ways[N];//存储排列结果
int used[N];//判断当前数字是否被用过
int x, res;
//将l~r之间的序列转化为数字
int cvt(int l, int r){
int ans = 0;
for(int i = l; i <= r; i ++){
ans = ans * 10 + ways[i];
}
return ans;
}
void dfs(int u){
if(u > 9){
for(int i = 1; i <= 6; i ++)//a最多不超过n的位数且不大于1e6,即a最多为6位
for(int j = i + 1; j <=8; j ++){
int a = cvt(1, i);
int b = cvt(i + 1, j);
int c = cvt(j + 1, 9);
if(x * c == a * c + b) res ++;
}
return ;
}
for(int i = 1; i <= 9; i ++){
if(!used[i]){
ways[u] = i;
used[i] = true;
dfs(u + 1);
//恢复现场
ways[u] = 0;
used[i] = false;
}
}
}
int main(){
scanf("%d", &x);
dfs(1);
printf("%d", res);
return 0;
}