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

题目链接:

PREV-3 带分数

思路:

根据题意我们需要找到满足 ( n − x ) = z / y (n - x) = z / y (nx)=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;
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值