250192026-02-17 13:10:27999Maximális szorzat (50 pont)cpp17Accepted 50/5097ms7328 KiB
// Source: https://usaco.guide/general/io

#include <bits/stdc++.h>
using namespace std;
#define int long long
#pragma GCC optimize("O3,unroll-loops")
#pragma GCC target("avx2,bmi,bmi2,lzcnt,popcnt")

int pow(int a, int b){
    if(b==0)return 1;
    if(b%2)return (pow(a,b-1)*a)%(int)(1e9+7);
    int x=pow(a,b/2);
    return (x*x)%(int)(1e9+7);
}

signed main() {
    std::ios_base::sync_with_stdio(false);
    std::cin.tie(NULL);
    int n,k,b;cin>>n>>k>>b;
    vector<int> neg,poz,null;
    for(int i = 0;i<n;i++){
        int a;cin>>a;
        if(a==0)null.push_back(a);
        else if(a>0)poz.push_back(a);
        else neg.push_back(a);
    }
    sort(neg.begin(),neg.end());
    sort(poz.rbegin(),poz.rend());
    int sum=0,ans=1,veszf=0;
    for(int i = neg.size()-1;i>=0;i--){
        if(i>=b)sum+=-neg[i];
        else ans=(ans*neg[i])%(int)(1e9+7);
        veszf+=-neg[i]-1;
    }
    veszf=max(veszf,0LL);
    if(sum>k||neg.size()<b||(poz.size()+null.size()==0&&b==neg.size()&&veszf<k)){
        cout<<-1<<endl;
        return 0;
    }
    if(poz.size()+null.size()==0&&b==neg.size()){
        ans=1;
        set<pair<int,int>> s;
        int currn=neg[0],currdb=1;
        for(int i = 1;i<neg.size();i++){
            if(currn!=neg[i]){
                s.insert({currn,currdb});
                currn=neg[i];
                currdb=1;
            }
            else currdb++;
        }
        s.insert({currn,currdb});
        while(k>0){
            auto [A,B]=*s.begin();
            if(B<=k){
                s.erase({A,B});
                auto it=s.lower_bound({A+1,0});
                pair<int,int> i=*it;
                if(it!=s.end()&&i.first==A+1){
                    s.erase({i});
                    s.insert({A+1,B+i.second});
                }
                else if(it==s.end()||it!=s.end()&&i.first!=A+1){
                    s.insert({A+1,B});
                }
                k-=B;
            }
            else{
                s.erase({A,B});
                auto it=s.lower_bound({A+1,0});
                pair<int,int> i=*it;
                if(it!=s.end()&&i.first==A+1){
                    s.erase({i});
                    s.insert({A+1,k+i.second});
                    s.insert({A,B-k});
                }
                else if(it==s.end()||it!=s.end()&&i.first!=A+1){
                    s.insert({A+1,k});
                    s.insert({A,B-k});  
                }
                break;
            }
        }for(auto i : s)ans=(ans*pow(i.first,i.second))%(int)(1e9+7);
        cout<<ans<<endl;
        return 0;
    }
    k-=sum;
    if(null.size()+neg.size()-b>k){
        cout<<0<<endl;
        return 0;
    }
    k-=(null.size()+neg.size()-b);
    for(int i = 0;i<null.size()+neg.size()-b;i++){
        poz.push_back(1);
    }
    int currn=0,currdb=0;
    if(poz.size()>0)currn=poz[0],currdb=1;
    set<pair<int,int>> s;
    for(int i = 1;i<poz.size();i++){
        if(currn!=poz[i]){
            s.insert({currn,currdb});
            currn=poz[i];
            currdb=1;
        }
        else currdb++;
    }
    if(poz.size()>0)s.insert({currn,currdb});
    //for(auto[a,b]:s)cout<<a<<' '<<b<<endl;
    while(k>0){
        auto [A,B]=*s.begin();
        if(B<=k){
            s.erase({A,B});
            auto it=s.lower_bound({A+1,0});
            pair<int,int> i=*it;
            if(it!=s.end()&&i.first==A+1){
                s.erase({i});
                s.insert({A+1,B+i.second});
            }
            else if(it==s.end()||it!=s.end()&&i.first!=A+1){
                s.insert({A+1,B});
            }
            k-=B;
        }
        else{
            s.erase({A,B});
            auto it=s.lower_bound({A+1,0});
            pair<int,int> i=*it;
            if(it!=s.end()&&i.first==A+1){
                s.erase({i});
                s.insert({A+1,k+i.second});
                s.insert({A,B-k});
            }
            else if(it==s.end()||it!=s.end()&&i.first!=A+1){
                s.insert({A+1,k});
                s.insert({A,B-k});  
            }
            break;
        }
    }
    //for(auto [a,b]:s)cout<<a<<' '<<b<<endl;
    for(auto i : s)ans=(ans*pow(i.first,i.second))%(int)(1e9+7);
    cout<<ans<<endl;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms316 KiB
2Accepted0/01ms316 KiB
3Accepted0/01ms508 KiB
4Accepted0/01ms316 KiB
5Accepted0/03ms532 KiB
6Accepted2/21ms316 KiB
7Accepted2/21ms316 KiB
8Accepted2/21ms396 KiB
9Accepted2/21ms316 KiB
10Accepted2/26ms1128 KiB
11Accepted2/282ms7328 KiB
12Accepted1/197ms7280 KiB
13Accepted1/11ms316 KiB
14Accepted1/14ms564 KiB
15Accepted1/112ms1068 KiB
16Accepted1/114ms1196 KiB
17Accepted1/110ms956 KiB
18Accepted1/14ms948 KiB
19Accepted1/124ms1596 KiB
20Accepted1/116ms1452 KiB
21Accepted1/185ms7292 KiB
22Accepted1/113ms1456 KiB
23Accepted1/176ms4256 KiB
24Accepted1/193ms6856 KiB
25Accepted2/21ms316 KiB
26Accepted2/23ms564 KiB
27Accepted2/250ms3836 KiB
28Accepted1/150ms3724 KiB
29Accepted2/210ms1012 KiB
30Accepted1/135ms1548 KiB
31Accepted1/123ms1456 KiB
32Accepted2/29ms436 KiB
33Accepted2/230ms1456 KiB
34Accepted1/129ms1548 KiB
35Accepted2/235ms1452 KiB
36Accepted2/235ms1424 KiB
37Accepted2/234ms1456 KiB
38Accepted2/235ms1476 KiB
39Accepted1/19ms316 KiB