166542025-05-07 18:26:31sztomiMaximális szorzat (50 pont)cpp17Elfogadva 50/5026ms1100 KiB
#include <bits/stdc++.h>

using namespace std;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    int n, k, b;
    cin >> n >> k >> b;
    vector<int> poz;
    vector<int> neg;
    int temp;
    for(int i = 0; i < n; i++){
        cin >> temp;
        if(temp >= 0){
            poz.push_back(temp);
        }
        else if(temp < 0){
            neg.push_back(temp);
        }
    }
    sort(neg.begin(), neg.end(), greater<int>());


    if(neg.size() < b){
        cout << "-1\n";
        return 0;
    }

    int kell = neg.size()-b;
    int elhasznal = 0;
    for(int i = 0; i < kell; i++){
        elhasznal += -neg[i];
        poz.push_back(0);
    }

    if(elhasznal > k){
        cout << "-1\n";
        return 0;
    }
    k -= elhasznal;

    long long ret = 1;
    long long mod = 1e9 + 7;
    if(poz.size() > 0){
        sort(poz.begin(), poz.end());
        int elozo = 0;
        int meddig = 0;
        int feltolt = 0;
        for(int i = 1; i < poz.size(); i++){
            elozo = elozo + (poz[i]-poz[i-1])*i;
            if(elozo <= k){
                meddig = i;
                feltolt = elozo;
            }
            else{
                break;
            }
        }

        k -= feltolt;
        int also_db = meddig+1;
        int also = poz[meddig];

        //cout << "also: " << also << " also_db: " <<also_db << " " << k << "\n";

        //cout << "also_db " << also_db << " k " << k << "\n";
        int osszes_novel = k / also_db;
        also += osszes_novel;
        k -= osszes_novel*also_db;
        //cout << "osszes_novel " << osszes_novel << "\n";

        also_db -= k;
        //cout << "vegso alsodb " << also_db << " " << also << "\n";
        for(int i = 0; i < also_db; i++){
            ret *= also;
            ret %= mod;
        }
        for(int i = 0; i < k; i++){
            ret *= (also + 1);
            ret %= mod;
        }

        for(int i = also_db+k; i < poz.size(); i++){
            ret *= poz[i];
            ret %= mod;
        }

        for(int i = neg.size()-b; i < neg.size(); i++){
            ret *= abs(neg[i]);
            ret %= mod;
            //cout << "raszoroz " << neg[i] << "\n";
        }
    }
    else{
        long long sum = 0;
        for(int i = 0; i < neg.size(); i++){
            sum -= (neg[i]+1);
        }

        if(sum < k){
            cout << "-1\n";
            return 0;
        }

        int elozo = 0;
        int meddig = neg.size()-1;
        int feltolt = 0;
        for(int i = neg.size()-2; i >= 0; i--){
            elozo = elozo + (-neg[i+1]+neg[i])*(neg.size()-i-1);
            //cout << i << " " << neg[i] << " " << elozo <<"\n";
            if(elozo <= k){
                meddig = i;
                feltolt = elozo;
            }
            else{
                break;
            }
        }
        //cout << meddig << " " << feltolt << "\n";

        k -= feltolt;
        int also_db = neg.size()-meddig;
        int also = -neg[meddig];

        //cout << "also: " << also << " also_db: " <<also_db << " " << k << "\n";

        //cout << "also_db " << also_db << " k " << k << "\n";
        int osszes_novel = k / also_db;
        also -= osszes_novel;
        k -= osszes_novel*also_db;
        //cout << "osszes_novel " << osszes_novel << "\n";

        also_db -= k;
        //cout << "vegso alsodb " << also_db << " " << also << "\n";
        for(int i = 0; i < also_db; i++){
            ret *= also;
            ret %= mod;
        }
        for(int i = 0; i < k; i++){
            ret *= (also - 1);
            ret %= mod;
        }

        for(int i = 0; i < neg.size()-(also_db+k); i++){
            //cout << "szoroz " << neg[i] << "\n";
            ret *= -neg[i];
            ret %= mod;
        }

    }


    cout << ret << "\n";
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base50/50
1Elfogadva0/01ms316 KiB
2Elfogadva0/01ms316 KiB
3Elfogadva0/01ms512 KiB
4Elfogadva0/01ms316 KiB
5Elfogadva0/03ms456 KiB
6Elfogadva2/21ms316 KiB
7Elfogadva2/21ms316 KiB
8Elfogadva2/21ms316 KiB
9Elfogadva2/21ms320 KiB
10Elfogadva2/23ms476 KiB
11Elfogadva2/224ms952 KiB
12Elfogadva1/125ms1016 KiB
13Elfogadva1/11ms316 KiB
14Elfogadva1/13ms316 KiB
15Elfogadva1/18ms728 KiB
16Elfogadva1/110ms820 KiB
17Elfogadva1/19ms820 KiB
18Elfogadva1/16ms820 KiB
19Elfogadva1/120ms984 KiB
20Elfogadva1/116ms996 KiB
21Elfogadva1/126ms1040 KiB
22Elfogadva1/110ms948 KiB
23Elfogadva1/126ms956 KiB
24Elfogadva1/125ms1100 KiB
25Elfogadva2/21ms316 KiB
26Elfogadva2/23ms316 KiB
27Elfogadva2/213ms668 KiB
28Elfogadva1/113ms820 KiB
29Elfogadva2/29ms820 KiB
30Elfogadva1/126ms936 KiB
31Elfogadva1/112ms948 KiB
32Elfogadva2/21ms316 KiB
33Elfogadva2/226ms1024 KiB
34Elfogadva1/126ms1012 KiB
35Elfogadva2/226ms948 KiB
36Elfogadva2/226ms1056 KiB
37Elfogadva2/226ms1020 KiB
38Elfogadva2/226ms1016 KiB
39Elfogadva1/11ms316 KiB