思路:
肯定每回只加最大值和次大值
如果 一開始的最大值》0且次大值<0 那就一直加 加到次大值》0
搞乙個矩陣 推斐波那契數列
求和 就好…
//by siriusren
#include
#include
#include
using
namespace
std;
const
int mod=10000007,n=100050;
#define int long long
int n,k,ans,maxx1=-mod,maxx2=-mod,a[n];
struct matrix
void bgn()
}fst,change,jy;
matrix operator*(matrix a,matrix b)
bool cmp(int a,int b)
matrix pow(matrix a,int y)return res;
}signed main()
while(maxx1>0&&maxx2<0&&k>0)maxx2+=maxx1,(ans+=maxx2)%=mod,k--;
change.bgn(),fst.a[1][1]=maxx1,fst.a[2][1]=maxx2,fst.a[3][1]=ans;
jy=pow(change,k)*fst;
printf("%lld\n",(jy.a[3][1]+mod)%mod);
}
BZOJ4547 小奇的集合
有乙個大小為n的可重集s,小奇每次操作可以加入乙個數a b a,b均屬於s 求k次操作後它可獲得的s的和的最大值。資料保證這個值為非負數 很顯然,我們每次肯定是取集合中最大的兩個數,那麼我們設這兩個數為 a b,當前的和為 s 顯然有轉移 a b,b a b,s a b s,那麼用矩陣乘法加速即可。...
BZOJ4547 小奇的集合(矩乘)
傳送門 由於資料保證最後的答案為非負數,那麼序列就有兩種情況 1 序列中有兩個或兩個以上非負數。2 序列中只有乙個非負數。對於第一種情況,每一次的操作一定是將最大的兩個數相加放入序列中。比如有不降序列 a1 a2,a3 an 1,an 進行多次操作就可以寫出如下的序列 a1 a2,a3 a n 1,...
快速冪(矩陣快速冪)
求 3 0 3 1 3 n mod 1000000007 input 輸入乙個數n 0 n 10 9 output 輸出 計算結果 sample input 3sample output 40 分析 利用等比數列的求和公式得所求和是 3 n 1 1 2,如果暴力求3 n 1 會超時,這裡引入快速冪來...