暴力思路:
首先我们观察样例
100 = 3 + 69258/714
转化为n = a + b/c
n是题目中给出的数据,我们就只需要对a,b,c进行枚举即可
我们通过递归列举出1~9的全排列
然后从第一个排列开始,将其划分为三段,分别对应三个数
比如说123456789
现在取a = 1;b = 5;c = 3
那么a = 1
b = 23456
c = 789
这样分别对a,b,c取不同的位数,我们就可以列举出123456789中a,b,c的所有取数情况
然后分别代入式子n = a + b/c判断等式是否成立即可
这个地方需要注意一下,将其转化为乘法的形式,因为整型数据是直接舍弃小数点的
即判断cn == ac+b是否成立,成立则说明成功找到一个
然后从头到尾依次对所有的全排列进行如上的操作
最终就能很暴力的得出答案
当然我们在其中可以通过一些a,b,c之间的关系进行时间的优化
然后全排列使用递归来输出比用STL中的permutation来得更快,这里就采用递归了
#include<iostream>
#include<cstdio>
#include<cstring>
int n,cnt,a,b,c;
const int N = 10;
int st[N];
int re[N];
using namespace std;
void dfs(int u)
{
if(u > 9){//边界
for(int a_ = 1;a_ < n;a_++){
a = a*10 + re[a_];
if(a > n)
break;
for(int b_ = (9-a_)/2;b_ <= 9-a_-1;b_++){
for(int i = a_+1;i <= a_+b_;i++)
b = b*10 + re[i];
for(int i = a_+b_+1;i <= 9;i++)
c = c*10 + re[i];
if(n*c == a*c+b) cnt++;
b = 0;
c = 0;
}
}
a = 0;
return;
}
for(int i = 1;i <= 9;i++){
if(!st[i]){
st[i] = 1;
re[u] = i;
dfs(u+1);
st[i] = 0;
}
}
}
int main()
{
cin >> n;
dfs(1);
cout << cnt;
return 0;
}