求满足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;
}