传送门
问题描述
100 可以表示为带分数的形式:100 = 3 + 69258 / 714。
还可以表示为:100 = 82 + 3546 / 197。
注意特征:带分数中,数字1~9分别出现且只出现一次(不包含0)。
类似这样的带分数,100 有 11 种表示法。
输入格式
从标准输入读入一个正整数N (N<1000*1000)
输出格式
程序输出该数字用数码1~9不重复不遗漏地组成带分数表示的全部种数。
注意:不要求输出每个表示,只统计有多少表示法!
样例输入1
100
样例输出1
11
样例输入2
105
样例输出2
6
利用STL中的next_permuta()函数可以得到1-9的所有全排列, 当然也可以用dfs来得到全排列,
得到全排列后把九个数字分成三份分别为a, b, c由题意可得限制条件为
1.a < n
2, c != 0
3, b > c && b % c == 0 && b / c == n - a
代码如下`
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<time.h>
using namespace std;
int num[10];
int sum;
int getsum(int a, int b) //求得num[a] - num[b]所组成的整数
{
int re = 0;
for(int i = a; i<= b; i++)
re = re * 10 + num[i];
return re;
}
void solve(int n)
{
for(int i = 1; i < 10; i++)
{
int a = getsum(1, i);
if(a >= n) return ;
for(int j = i + (9 - i)/2; j < 10; j++)
{
int b = getsum(i + 1, j);
int c = getsum(j + 1, 9);
if(b > c && c && b % c == 0 && b / c == n - a)
sum++;
}
}
}
int main()
{
int n;
scanf("%d", &n);
for(int i = 1; i < 10; i++)
num[i] = i;
do
{
solve(n);
}while(next_permutation(num + 1, num + 10));
printf("%d\n", sum);
return 0;
}