有乙個大小為n的可重集s,小奇每次操作可以加入乙個數a+b(a,b均屬於s),求k次操作後它可獲得的s的和的最大值。(資料保證這個值為非負數)
很顯然,我們每次肯定是取集合中最大的兩個數,那麼我們設這兩個數為
a ,
b,當前的和為
s ,顯然有轉移:a′
=b,b
′=a+
b,s′
=a+b
+s,那麼用矩陣乘法加速即可。
但是題目有負數,也就是說
a 可能小於
0,所以我們先人為的把a變成正數,然後再做矩陣乘法即可。
#include
#include
#include
#include
#define fo(i,j,k) for(int i=j;i<=k;i++)
#define fd(i,j,k) for(int i=j;i>=k;i--)
#define mo 10000007
#define ll long long
#define n 100010
using namespace std;
int a[n];
ll r[4],z[4];
ll zy[4][4]=,,,
};ll c[4][4],b[4][4];
void mul(ll p[4][4],ll q[4][4])
void pow(int t)
}int main()
BZOJ4547 小奇的集合(矩乘)
傳送門 由於資料保證最後的答案為非負數,那麼序列就有兩種情況 1 序列中有兩個或兩個以上非負數。2 序列中只有乙個非負數。對於第一種情況,每一次的操作一定是將最大的兩個數相加放入序列中。比如有不降序列 a1 a2,a3 an 1,an 進行多次操作就可以寫出如下的序列 a1 a2,a3 a n 1,...
BZOJ4547 Hdu5171 小奇的集合
給有乙個大小為n的可重集s,每次操作可以加入乙個數a b a,b均屬於s 求k次操作後它可獲得的s的和的最大 值。資料保證這個值為非負數 我們先來看看,因為我們要得到最大的s,所以每次我們都要使得a b最大 首先排除一開始得到的a,b為負數的情況,我們將a b放進s裡,那麼下一次操作就會將a a b...
BZOJ 4547 矩陣快速冪
思路 肯定每回只加最大值和次大值 如果 一開始的最大值 0且次大值 0 那就一直加 加到次大值 0 搞乙個矩陣 推斐波那契數列 求和 就好 by siriusren include include include using namespace std const int mod 10000007,...