BZOJ4547 小奇的集合

2021-09-30 13:43:55 字數 775 閱讀 2951

有乙個大小為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,...