带分数
100 可以表示为带分数的形式:100=3+69258714
还可以表示为:100=82+3546197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<10^6
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
思路:题目要求就是把n写成a+b/c的形式,其中要满足a,b,c用满1-9的数字且只用一次。本题可以直接暴力递归枚举,先利用递归枚举a,针对每一个a再枚举c然后确定a,c的情况下可以直接求出b看三者是否满足条件。
代码:
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
int n;
int st[12],l[12];
int cnt;
bool check(int a,int c){
long long b = (long long)n * c - a * c;
if(b==0)
return false;
for(int i=1;i<=9;i++)
l[i]=st[i];
while(b){
int x=b%10;
b/=10;
if(x==0||l[x]==1) return false;
else l[x]++;
}
for(int i=1;i<=9;i++)
if(!l[i])
return false;
return true;
}
void dfs_c(int k,int a,int c){
if(k==9)
return;
if(c!=0&&check(a,c)) cnt++;
for(int i=1;i<=9;i++){
if(!st[i]){
st[i]=1;
dfs_c(k+1,a,c*10+i);
st[i]=0;
}
}
}
void dfs_a(int k,int a){
if(a>=n)
return;
else{
if(a)
dfs_c(k,a,0);
for(int i=1;i<=9;i++)
if(!st[i]){
st[i]=1;
dfs_a(k+1,a*10+i);
st[i]=0;
}
}
}
int main(){
cin >> n;
dfs_a(0,0);
cout << cnt;
return 0;
}