蓝桥杯 PREV-3 带分数(dfs)

题目链接:

PREV-3 带分数

思路:

根据题意我们需要找到满足(nx)=z/y(n - x) = z / y(x,y,z)(x, y, z)三元组解的个数,且x,y,zx,y,z中所有数字不相同且刚好是1199的一个排列;
1.我们需要知道xx的位数不能超过nn(一个数xx的位数可以用lg(x)+1lg(x)+1计算得出)
2.zz的位数大于等于yy的位数;
然后我们依次搜索1199的全部排列,对于每一种排列,我们依次取x,y,zx,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;
}
posted @ 2020-02-03 14:53  YuhanのBlog  阅读(124)  评论(0编辑  收藏  举报