题意
传送门 SGU 491
题解
枚举 B B B 与 y y y,枚举总次数为 O ( n log n ) O(n\log n) O(nlogn)。若 A x + B y = N Ax+By = N Ax+By=N,则 A A A 是 N − B y N-By N−By 的约数。对于固定的 B y By By,枚举满足 A < B A<B A<B 的约数。预处理 [ 1 , n ] [1,n] [1,n] 的约数,总数是 O ( n log n ) O(n\log n) O(nlogn),故枚举约数均摊是 O ( log n ) O(\log n) O(logn),总枚举次数 O ( n log 2 n ) O(n\log^2 n) O(nlog2n)。对于固定 B B B 需要对 A A A 去重,此时枚举的 A A A 数量均摊意义下 O ( n / B log n ) O(n/B\log n) O(n/Blogn),则排序去重约 O ( n log 2 n ) − O ( n log 3 n ) O(n\log^2 n)-O(n\log^3 n) O(nlog2n)−O(nlog3n)。
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int MAXN = 1E5 + 5;
int N;
vector<int> fac[MAXN];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> N;
for (int i = 1; i <= N; ++i)
for (int j = i; j <= N; j += i)
fac[j].pb(i);
int res = 0;
for (int B = 2; B < N; ++B)
{
vector<int> rec;
for (int y = 1; y <= N / B; ++y)
{
int t = N - B * y;
for (int A : fac[t])
{
if (A >= B)
break;
rec.pb(A);
}
}
sort(rec.begin(), rec.end());
res += unique(rec.begin(), rec.end()) - rec.begin();
}
cout << res << '\n';
return 0;
}