蓝桥杯 PREV-3 带分数(dfs)
题目链接:
PREV-3 带分数
思路:
根据题意我们需要找到满足的三元组解的个数,且中所有数字不相同且刚好是到的一个排列;
1.我们需要知道的位数不能超过(一个数的位数可以用计算得出)
2.的位数大于等于的位数;
然后我们依次搜索到的全部排列,对于每一种排列,我们依次取的可能位数、从而得到相应数值,带进等式进行计算,如果相等答案加一即可;
代码:
#include<bits/stdc++.h>
using namespace std;
int n, cnt, a[15];
bool vst[15];
inline int f(int p, int len) {
int rs = 0;
while(len--) rs = rs * 10 + a[p++];
return rs;
}
inline void check() {
for(int i = log10(n) + 1; i; i--) {
int x = f(1, i);
for(int j = (9 - i) >> 1; j; j--) {
int y = f(1 + i, j), z = f(1 + i + j, 9 - i -j);
if((n - x) * y == z) ++cnt;
}
}
}
void dfs(int p) {
if(p == 10) { check(); return; }
for(int i = 1; i < 10; i++) {
if(!vst[i]) a[p] = i, vst[i] = 1, dfs(p + 1), vst[i] = 0;
}
}
int main() {
#ifdef MyTest
freopen("Sakura.txt", "r", stdin);
#endif
cin >> n;
dfs(1);
cout << cnt;
return 0;
}