Satisfactory Pairs (HackerRank pairs-again)

来源:互联网 发布:大数据的技术人员要求 编辑:程序博客网 时间:2024/06/01 11:43
题目链接:https://vjudge.net/problem/HackerRank-pairs-again

题意:给你一个正整数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|1using 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;}



0 0
原创粉丝点击