题目描述:
100 可以表示为带分数的形式:100=3+69258/714
还可以表示为:100=82+3546/197
注意特征:带分数中,数字 1~9分别出现且只出现一次(不包含 0)。
类似这样的带分数,100 有 11 种表示法。
输入格式:
从标准输入读入一个正整数N(1≤N<10^6)。
输出格式:
程序输出数字 N 用数码 1 ~ 9 不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
输入示例:
100
输出示例:
11
思路,暴力做法
根据简单的推理我们可以知道a,b,c合在一起是1-9的一个全排列,所以我们可以用dfs写一个全排列,在排到最后一位的时候,我们在这排列里面选出a,b,c,再通过题目给的式子判断是否满足。
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6;
int n, ans;
int way[20];
bool used[20];
int q[20] = {1,2,3,4,5,6,7,8,9};
int Get_num(int l, int r)
{
long long int p = 0;
for(int i = l; i <= r; i ++)
{
p *= 10;
p += way[i];
}
return p;
}
void xuanze()
{
long long int a, b, c;
for(int i = 1; i <= 7; i ++)
for(int j = i + 1; j <= 8; j ++)
{
a = Get_num(1, i);
b = Get_num(i + 1, j);
c = Get_num(j + 1, 9);
if(a * c + b == n * c) ans ++;
}
}
void dfs(int u)
{
if(u > 9)
{
xuanze();
return;
}
for(int i = 1; i <= 9; i ++)
{
if(!used[i])
{
way[u] = i;
used[i] = true;
dfs(u + 1);
used[i] = false;
way[u] = 0;
}
}
}
int main()
{
scanf("%d", &n);
dfs(1);
printf("%d\n", ans);
return 0;
}