- 題源:I - In Search of the Ultimate Artifact
- Abstract:\(n\) 個非負整數構成的數組 \(a\),可任選 \(k\) 個融合為一個新數,新數為 \(\prod\limits_{i=1}^{k}a_i\)。求進行若干次(可為0次)融合后的最大值。答案對 \(998244353\) 取模。
- Keyword:貪心(簽到題)
- Solution:觀察合并操作,發(fā)現本質上每次在減少 \(k-1\) 個元素。因此采用堆進行維護,貪心的先默認答案為堆頂,每次取出堆中 \(k-1\) 個元素對答案相乘即可。注意每次相乘都需要進行取模操作。
- Code:
/*
* Copyright (c) 2025 - Yerosius All Rights Reserved.
* @Author: Yerosius
* @Date: 2025-02-18 14:12:44
* @FilePath: /VSCodeProject/I_In_Search_of_the_Ultimate_Artifact.cpp
*/
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
#define int ll
#define endl "\n"
const int MOD=998244353;
void solve(){
int n,k;cin>>n>>k;
priority_queue<int>pq;
while(n--){
int _;cin>>_;
if(_) pq.push(_);//0對答案極其不利,因此讀入時直接忽略0
}
int ans=0;
if(pq.size()){//先默認答案為堆頂
ans=pq.top();
ans%=MOD;
pq.pop();
}
while(pq.size()>=k-1){
for(int i=0;i<k-1;i++){//取堆中k-1個元素對答案相乘
int _=pq.top();
_%=MOD;
ans*=_;
ans%=MOD;
pq.pop();
}
}
cout<<ans%MOD<<'\n';
}
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int t;cin>>t;
while(t--) solve();
return 0;
}