【发布时间】:2020-04-29 00:41:28
【问题描述】:
每次测试的时间限制:2 秒
每次测试的内存限制:512 MB给你两个分数
a/bc/d 和一个正数N。 考虑所有不可约分数e/f使得0 < e, f ≤ N和a/be/f c/d。让s是这些分数的序列 按分母升序排序,然后是分子(分数 如果f1 < f2或f1 = f2 and e1 < e2,e1/f1在e2/f2之前)。您应该首先打印序列s的n项或 整个序列s,如果它包含少于n项。输入
每个测试的第一行包含6个整数a、b、c、d、N、n(0 ≤ a ≤ 10^18、1 ≤ b, c, d, N ≤ 10^18、1 ≤ n ≤ 200 000、@987653)。输出
首先,打印您将输出多少个序列s。然后以正确的顺序输出这些术语。示例
- 输入:
输出:0 1 1 1 5 109 1 2 1 3 2 3 1 4 3 4 1 5 2 5 3 5 4 5- 输入:
输出:55 34 68 42 90 11 89 55- 输入:
输出:49 33 45 30 50 2390
到目前为止,我只设法编写了一个解决方案,它遍历从 1 到 N 的所有分母,并且对于每个分母,遍历从 a*f/b 到 c*f/d 的所有分子,添加所有找到答案的不可约分数。
这是我的代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
long long a, b, c, d, N, n;
vector<pair<long long, long long>> result;
long long gcd(long long a, long long b) {
while (b) {
a %= b;
swap(a, b);
}
return a;
}
void computeResult() {
for (long long f = 1; f <= N; f++) {
long long eMax = c*f / d;
if (c*f % d != 0) eMax++;
eMax = min(eMax, N);
for (long long e = a*f / b + 1; e < eMax; e++) {
if (gcd(e, f) == 1) {
result.push_back(make_pair(e, f));
if (result.size() == n)
return;
}
}
}
}
int main() {
cin >> a >> b >> c >> d >> N >> n;
computeResult();
cout << result.size() << endl;
for (pair<long long, long long> fraction : result)
cout << fraction.first << " " << fraction.second << endl;
}
很遗憾,这个解决方案太慢了。我想知道如何更有效地解决这个问题。
【问题讨论】:
-
我认为 SO 不是这个问题的正确平台。如果您想查看您的代码/算法(为了提高效率等),Code Review 是适合它的平台。请将您的问题移到那里。
-
@AjayDabas 我不想审查我的代码/算法。我知道它很慢。我正在寻找另一种更有效的解决方案。
-
能否给出这个问题的根源?可以在线测试解决方案吗?
-
@Evg,很遗憾,报名人数有限。
-
在 main 末尾迭代时,make 为
& fraction以避免无用的副本。也可以在 main 的开头尝试为result预分配空间。哦,不要使用endl
标签: c++ algorithm performance optimization fractions