题目链接:https://vjudge.net/problem/HackerRank-pairs-again
题意:给你一个正整数n,问你存在多少个正整数对a,b(a<b),
满足条件:存在正整数x,y,使得ax+by=n。
就预处理出n以内所有数的约数,然后暴力枚举a,暴力枚举x,
题意:给你一个正整数n,问你存在多少个正整数对a,b(a<b),
满足条件:存在正整数x,y,使得ax+by=n。
就预处理出n以内所有数的约数,然后暴力枚举a,暴力枚举x,
然后枚举n-ax的所有约数,判重,统计答案即可。
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <queue>
#include <vector>
#include <cmath>
#include <stack>
#include <string>
#include <sstream>
#include <map>
#include <set>
#define pi acos(-1.0)
#define LL long long
#define ULL unsigned long long
#define inf 0x3f3f3f3f
#define INF 1e18
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
typedef pair<int, int> P;
const double eps = 1e-10;
const int maxn = 1e6 + 5;
const int N = 3e5 + 5;
const int mod = 1e8;
vector<int>divisor[maxn];
int flag[maxn];
void init()
{
// for (int i = 2; i < N; i++){
// for (int j = i; j < N; j += i)
// divisor[j].push_back(i);
// }
for (int i = 1; i < N; i++){ // n(1/1 + 1/2 + 1/3 + ... 1/n ) 复杂度为nlongn
for (int j = 1; j*j < i; j++){
if (i % j) continue;
divisor[i].push_back(j);
if (j*j != i)
divisor[i].push_back(i / j);
}
}
}
int main(void)
{
// freopen("in.txt", "r", stdin);
init();
int n, ans;
while (cin >> n)
{
memset(flag, 0, sizeof(flag));
ans = 0;
for (int a = 1; a < n; a++){ // 枚举a
for (int x = 1; x * a < n; x++){ // 枚举x 外两层循环的复杂度为nlogn [ n(1/1 + 1/2 + 1/3 + ... 1/n ) 复杂度为nlongn ]
int yb = n - x*a; // yb = y*b = n - x*a
for (int i = 0; i < divisor[yb].size(); i++){ //枚举y*b的因子 这一层复杂度logn, (1/1 + 1/2 + 1/3 + ... 1/n) ~ logn
int t = divisor[yb][i];
if (t <= a) continue;
if (flag[t] == a) continue; // 去重
ans++;
flag[t] = a;
}
}
}
cout << ans << endl;
}
return 0;
}