社区讨论

关于此题与一些随机的爆零求助

P6767[BalticOI 2012/2020] 玫瑰 (Day0)参与者 8已保存回复 30

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
30 条
当前快照
1 份
快照标识符
@lo1wzor1
此快照首次捕获于
2023/10/23 04:21
2 年前
此快照最后确认于
2023/11/03 04:48
2 年前
查看原帖
@12345678hzx
按照这位大佬的思路写的 QwQ。
和第一篇题解对拍了 10610^6 组数据都没出错。
后来要回家了,电脑没关直接挂机拍 10810^8 组数据,早上来看电脑黑屏了呜呜呜
CPP
#include <bits/stdc++.h>
using namespace std;
long long n, a, b, c, d;
long long ans = 0;
inline long long gcd(long long a, long long b) {
    return b ? gcd(b, a % b) : a;
}

int main() {
    scanf("%lld%lld%lld%lld%lld", &n, &a, &b, &c, &d);
    if (a * d < b * c) swap(a, c), swap(b, d);
    long long l = a / gcd(a, c) * c, price = (l / a) * b;
    ans = (n / l) * price;
    if (n % l == 0) {
        printf("%lld\n", ans);
        return 0;
    }
    long long lst = n - (n / l) * l, x = 0;
    long long Min = 1e18;
    while (x * a <= lst) {
        long long qwq = (lst - x * a) / c + 1;
        if ((lst - x * a) % c == 0) qwq--;
        long long res = qwq * d + x * b;
        // cout << '\t' << ceil((lst - x * a) * 1.000 / c) << endl;
        // cout << x <<  ' ' << res << endl;
        Min = min(Min, res);
        x++;
    }
    long long res = (lst / a + 1) * b;
    if (lst % a == 0) res = (lst / a) * b;
    Min = min(Min, res);
    // cout << Min << endl;
    printf("%lld\n", ans + Min);
    return 0;
}

回复

30 条回复,欢迎继续交流。

正在加载回复...