BZOJ4547 Hdu5171 小奇的集合

2022-05-19 20:44:56 字數 1192 閱讀 6777

給有乙個大小為n的可重集s,每次操作可以加入乙個數a+b(a,b均屬於s),求k次操作後它可獲得的s的和的最大

值。(資料保證這個值為非負數)

我們先來看看,因為我們要得到最大的s,所以每次我們都要使得a+b最大

首先排除一開始得到的a,b為負數的情況,我們將a+b放進s裡,那麼下一次操作就會將a+(a+b)(假設a>b)放進s裡,再下一次就會將(a+b)+(a+b+a)放進s裡,這樣子就相當於乙個斐波那契數列,我們就可以用矩陣乘法來求值

但是資料保證和的最大值為非負數,就說明a一定為正數,有可能b為負數

那麼我們就暴力操作直到將b變為非負數即可

wa了半版,發現原來不能用負數來取mod,要+mod數再取mod,氣死我了

#include#include

#include

#include

#include

using

namespace

std;

typedef

long

long

ll;int mod=10000007

;struct

node

}d,cmd;

node chengfa(node a,node b)}}

returnc;}

node p_mod(node a,

intb)

return

ans;

}ll a[

110000

];int

main()

else

if(a[i]>max2) max2=a[i];

}if(k==0)

while(max2<0

)

}d.a[

1][1]=max1;d.a[1][2]=max2;d.a[1][3]=sum;

cmd.a[

1][1]=1;cmd.a[2][1]=1

; cmd.a[

1][2]=1

; cmd.a[

1][3]=1;cmd.a[2][3]=1;cmd.a[3][3]=1

; d=chengfa(d,p_mod(cmd,k));

printf(

"%lld\n

",d.a[1][3

]);

return0;

}

BZOJ 4547 矩陣快速冪

思路 肯定每回只加最大值和次大值 如果 一開始的最大值 0且次大值 0 那就一直加 加到次大值 0 搞乙個矩陣 推斐波那契數列 求和 就好 by siriusren include include include using namespace std const int mod 10000007,...

hdu 5171 fib矩陣快速冪

題目 題意 給你n個數字,讓你用這些數字構造乙個最大的集合,其中可以選取m次最大的倆個數加入集合中,求最後集合中的數最大。multi test cases about 3 the first line contains two integers n and k 2 n 100000,1 k 1000...

BZOJ4547 小奇的集合

有乙個大小為n的可重集s,小奇每次操作可以加入乙個數a b a,b均屬於s 求k次操作後它可獲得的s的和的最大值。資料保證這個值為非負數 很顯然,我們每次肯定是取集合中最大的兩個數,那麼我們設這兩個數為 a b,當前的和為 s 顯然有轉移 a b,b a b,s a b s,那麼用矩陣乘法加速即可。...