2022年c++的520答案

04 关于奇数的等式

题目分析/解题思路

暴力枚举 x, y, z 的话我们的时间复杂度为 O(m^3/8),这个时间复杂度有些紧张,我们考虑变换原式来降低时间复杂度。

所以我们可以发现我们只需要枚举前两个数即可,现在算法的时间复杂度为O(m^2/4)。

 

代码:

#include <bits/stdc++.h>

using namespace std;

tuple<int, int, int> f(int n, int m) {

    for (int i = 1; i <= m; i += 2)

        for (int j = i + 2; j <= m; j += 2) {

            int x = i * j * n;

            int y = 3 * i * j - n * (i + j);

            if (x % y) continue;

            int k = x / y;

            if (k > m or k <= j) continue;

            return {i, j, k};

        }

    return {0, 0, 0};

}

int main() {

    cin.tie(nullptr)->sync_with_stdio(false);

    int n, m;

    cin >> n >> m;

    auto [x, y, z] = f(n, m);

    if (x > 0)

        cout << x << ' ' << y << ' ' << z << '\n';

    else

        cout << "No solution in (3, " << m << "].\n";

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丑小克

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值