100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1∼9
分别出现且只出现一次(不包含 0)。
类似这样的带分数,100有 11种表示法。
输入格式
一个正整数。
输出格式
输出输入数字用数码 1∼9
不重复不遗漏地组成带分数表示的全部种数。
数据范围
1≤N<106
输入样例1:
100
输出样例1:
11
输入样例2:
105
输出样例2:
6
#include<iostream>
#include<string.h>
using namespace std;
int N;
bool g[20],backup[20];
long long ans=0;
bool check(int a,int c)//检查a和c是否合法
{
int b=N*c-a*c;
if(!a||!b||!c) return false;
memcpy(backup,g,sizeof(g));
int x;
while(b)
{
x=b%10;//数字重了就不合法
if(!x||backup[x]) return false;
b/=10;
backup[x]=true;
}
for(int i=1;i<=9;++i)//少一个数字没出现就不合法
if(!backup[i]) return false;
return true;
}
void dfs_c(int n,int a,int c)
{
if(n>=9) return;//已经用了9个数字就绝对不合法
if(check(a,c)) ++ans;
for(int i=1;i<=9;++i)
if(!g[i]){
g[i]=true;
dfs_c(n+1,a,c*10+i);
g[i]=false;
}
}
void dfs_a(int n,int a)
{
if(a>=N) return;//a必须比N小,给b,c留数字
if(a) dfs_c(n,a,0);
for(int i=1;i<=9;++i)
if(!g[i]){
g[i]=true;
dfs_a(n+1,a*10+i);
g[i]=false;
}
}
int main()
{
cin>>N;
dfs_a(0,0);//用了0个数字,a当前是0
cout<<ans;
}