BZOJ 4547 矩陣快速冪

2022-04-30 04:54:10 字數 799 閱讀 5820

思路:

肯定每回只加最大值和次大值

如果 一開始的最大值》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 會超時,這裡引入快速冪來...