100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9 分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9 不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<1e6
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
#include<bits/stdc++.h>
using namespace std;
int st[10],n,res;
bool check(int a,int b){
int cp[10];
memcpy(cp,st,sizeof st);
long long c=(long long)b*n-b*a;//n=a+c/b
//不用long long b可能为8位数,和n相乘溢出,b变成负数,个位数字的余数可能也是负数,cp的下标就会越界。
if(!c||!a||!b)return false;
while(c){
if(c%10==0||cp[c%10]==1)//该位为0或是该位已经被用过了
return false;
cp[c%10]=1;
c/=10;
}
for(int i=1;i<10;i++)//确保每一位被用过
if(!cp[i])return false;
return true;
}
void dfsb(int a,int b){
if(check(a,b))res++;
for(int i=1;i<=9;i++){
if(!st[i]){
st[i]=1;
dfsb(a,b*10+i);
st[i]=0;
}
}
}
void dfsa(int a){
if(a>=n)return;
dfsb(a,0);
for(int i=1;i<=9;i++){
if(!st[i]){//该位置的数还没有被选
st[i]=1;
dfsa(a*10+i);
st[i]=0;
}
}
}
int main(){
cin>>n;
dfsa(0);
cout<<res;
}