sgu491

求满足ax + by = n,(x >= 1, y >= 1)的a,b有多少个。

比赛时候没有做出来,是因为想到只知道n,要求a,b,x,y枚举的话4个铁定超时

如这类找满足条件个数的,如果不能暴力枚举的话都要尽量去转化成为求因子个数。

转化成n - ax = by,枚举a,x,那么b的个数就相当于n - ax中的因子个数,依次检查每个因子,要比a大,然后去重统计。

#include <cstdio>
#include <string.h>
#include <vector>
#include <algorithm>

using namespace std;
const int MAX_NUMBER = 100005;

vector<int> factor[MAX_NUMBER];
int temp_ans[MAX_NUMBER * 50];
int temp_factor[MAX_NUMBER];
int number;

void getAllFactor(int n) {
	int factor_number = 0;
	for (int i = 1; i * i <= n; i++) {
		if (n % i == 0) {
			if (i * i == n) {
				temp_factor[factor_number++] = i;
			}
			else {
				temp_factor[factor_number++] = i;
				temp_factor[factor_number++] = n / i;
			}
		}
	}
	sort(temp_factor, temp_factor + factor_number);
	for (int i = 0; i < factor_number; i++) {
		factor[n].push_back(temp_factor[i]);
	}
}

int main() {
	for (int i = 2; i < MAX_NUMBER; i++) {
		getAllFactor(i);
	}
	while (scanf("%d", &number) != EOF) {
		long long ans = 0;
		for (int a = 1; a <= number / 2; a++) {
			int temp_number = 0;
			for (int x = 1; number - a * x > 0; x++) {
				int by = number - a * x;
				for (int i = 0; i < factor[by].size(); i++) {
					int b = factor[by][i];
					if (b > a) {
						temp_ans[temp_number++] = b;
					}
				}
			}
			sort(temp_ans, temp_ans + temp_number);
			if (temp_number > 0) {
				ans++;
			}
			for (int i = 1; i < temp_number; i++) {
				if (temp_ans[i] != temp_ans[i - 1]) {
					ans++;
				}
			}
		}
		printf("%I64d\n", ans);
	}
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值