减数游戏
- 比赛主页
- 我的提交
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
dstdst喜欢对序列操作。他的好胖友tanaotanao送给他一个序列a1...ana1...an。dstdst进行n−1次操作,每次操作删去序列中任意两个数a,b,并往序列中加入一个数a×b+k。设最后剩下的数为p,tanaotanao想知道p可能的最大值。
注意并不能完全用优先队列 因为当入队时候数的值大于mod那么就会破坏排序
int n,k;
const int mod=1e9+7;
int main(){
cin>>n>>k;
priority_queue,greater>pq;
queue q;
ll mm=-INF;
for(int i=0;i>x;
pq.push(x);
mm=max(mm,x);
}
for(int i=2;i<=n;i++){
ll x=pq.top();
pq.pop();
ll y=pq.top();
pq.pop();
ll m=x*y+k;
if(m>=mod){
q.push(x);
q.push(y);
while (!pq.empty()) {
q.push(pq.top());
pq.pop();
}
while (q.size()!=1) {
x=q.front();
q.pop();
y=q.front();
q.pop();
q.push((x*y+k)%mod);
}
cout<



