HDOJ 5171(矩陣乘方)

2021-06-28 18:09:10 字數 1622 閱讀 3337

果然人是在不斷的進步的哈,最近了解了矩陣乘方,然後去把以前沒a的題都a了。

一開始有點小錯誤,就是沒有意識到會溢位,要用__int64才對;還有一開始的數字打錯了(注意細節哈);最重要的是別忘記每次新算的時候都要進行清零操作,即為memset(a,0,sizeof(a));之類的,反正加了沒壞處!

哦,對了,還有一點就是再對數字進行排序的時候,不能用sort直接來排,那樣會超時,要用快拍或其他,降低時間複雜度;

問題描述

gty的朋友zzf的生日要來了,gty問他的**送什麼禮物比較好,他的乙個**說送乙個可重集吧!於是gty找到了乙個可重集s,gty能使用神犇魔法k次,每次可以向可重集中加入乙個數 a+

b(a,

b∈s)

,現在gty想最大化可重集的和,這個工作就交給你了。

注:可重集是指可以包含多個相同元素的集合

輸入描述

多組資料(約3組),每組資料的第一行有兩個數n,

k(2≤

n≤100000,1

≤k≤1000000000

) 表示初始元素數量和可使用的魔法數,第二行包含n個數a(

1≤a

i ≤100000

) 表示初始時可重集的元素

輸出描述

對於每組資料,模10000007輸出可重集可能的最大和。
輸入樣例

3 2

3 6 2

輸出樣例

//f用來儲存構造的矩陣;

__int64 f[4][4],ss[4][4];

void martix(__int64 a[4][4],__int64 b[4][4]);

for(i=1;i<=3;i++)

for(j=1;j<=3;j++)

for(k=1;k<=3;k++)

for(i=1;i<=3;i++)

for(j=1;j<=3;j++)

a[i][j]=c[i][j]%mod;

}int magic(int k);

int i,j;

//構造單位矩陣;

for(i=1;i<=3;i++) sum[i][i]=1;

while(k)

int ans=0;

ans=(sum[1][1]*ss[1][1]+sum[1][2]*ss[2][1]+sum[1][3]*ss[3][1])%mod;

return ans;

}void quicksort(int l,int r)

quicksort(1,n);

ss[1][1]=sum;

ss[2][1]=a[n];

ss[3][1]=a[n-1];

ans=magic(k);

cout<

演算法訓練 矩陣乘方

問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...

演算法訓練 矩陣乘方

問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...

演算法提高 矩陣乘方

問題描述 給定乙個矩陣a,乙個非負整數b和乙個正整數m,求a的b次方除m的餘數。其中乙個nxn的矩陣除m的餘數得到的仍是乙個nxn的矩陣,這個矩陣的每乙個元素是原矩陣對應位置上的數除m的餘數。要計算這個問題,可以將a連乘b次,每次都對m求餘,但這種方法特別慢,當b較大時無法使用。下面給出一種較快的演...