题目链接:
PREV-3 带分数
思路:
根据题意我们需要找到满足
(
n
−
x
)
=
z
/
y
(n - x) = z / y
(n−x)=z/y的
(
x
,
y
,
z
)
(x, y, z)
(x,y,z)三元组解的个数,且
x
,
y
,
z
x,y,z
x,y,z中所有数字不相同且刚好是
1
1
1到
9
9
9的一个排列;
1.我们需要知道
x
x
x的位数不能超过
n
n
n(一个数
x
x
x的位数可以用
l
g
(
x
)
+
1
lg(x)+1
lg(x)+1计算得出)
2.
z
z
z的位数大于等于
y
y
y的位数;
然后我们依次搜索
1
1
1到
9
9
9的全部排列,对于每一种排列,我们依次取
x
,
y
,
z
x,y,z
x,y,z的可能位数、从而得到相应数值,带进等式进行计算,如果相等答案加一即可;
代码:
#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;
}