题意
有一个大小为n的可重集S,小奇每次操作可以加入一个数a+b(a,b均属于S),求k次操作后它可获得的S的和的最大值。(数据保证这个值为非负数)
n<=10^5,k<=10^9,|ai|<=10^5。答案对10000007取模。
分析
显然是每次找集合中最大的两个元素相加。先找到最大的两项k1,k2,若一项为负则往后推一项。可以发现集合中加入的第i个数中k1的系数为斐波那契数列第i项,k2系数为第i+1项,那么我们就可以通过求斐波那契数列的前n项和来解决这个问题。
通过打表我发现s(n)=f(n+2)-1,事实证明这貌似也是对的,但我并不会证明。如果有大爷会的话请教教我。
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;