果然人是在不斷的進步的哈,最近了解了矩陣乘方,然後去把以前沒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較大時無法使用。下面給出一種較快的演...