運算元 矩陣快速冪解法

2022-05-01 07:12:11 字數 1434 閱讀 9623

給定長度為n的陣列a,定義一次操作為:

1. 算出長度為n的陣列s,使得si= (a[1] + a[2] + ... + a[i]) mod 1,000,000,007;

2. 執行a = s;

現在問k次操作以後a長什麼樣。

第一行兩個整數n,k(1 <= n <= 2000, 0 <= k <= 1,000,000,000);

第二行n個整數表示a陣列(0 <= a

i
<= 1,000,000,000)。
一行n個整數表示答案。
示例1

3 1

1 2 3

1 3 6

示例2

5 0

3 14 15 92 6

3 14 15 92 6

這題非常容易找到矩陣a,

1 1 1 1 1

0 1 1 1 1

0 0 1 1 1

0 0 0 1 1

0 0 0 0 1

就是這樣的矩陣,

但是要注意一點 n有2000;

所以直接寫出這個矩陣不行,壓縮一下就ok了

mat operator * (mat & a)

}return ans;

}由於規律性非常明顯,所以可以用乙個一維陣列儲存

然後就是常規的矩陣快速冪操作。

不過這題他們說有其他的解法

找規律好像可以做,但是我不會。

只能想到矩陣快速冪的方法

矩陣快速冪有點慢,不過能ac也ok

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 

7 #include 8

using

namespace

std;

9const

int maxn = 2000;10

const

long

long mod = 1e9 + 7

;11 typedef long

long

ll;12

struct

mat

17 mat operator * (mat &a) 23}

24return

ans;25}

26};

27mat modexp(mat a, ll b)

35return

ans;36}

37int

main()

45if (k == 0

) 51 printf("\n"

);52 } else60}

61return0;

62 }

快速冪解法

快速冪是一般求冪方法的優化,主要是在時間複雜度上的優化,從o n 到o logn 極大的降低了時間複雜度,也可以解決一些對時間複雜度要求嚴格的題目。include define ll long long int ll fun ll a,ll b return ans 由上面 可見,一般求冪方法簡單暴...

快速冪(矩陣快速冪)

求 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 會超時,這裡引入快速冪來...

快速冪 矩陣快速冪

快速冪 正常情況下求乙個數的冪時間複雜度為o n 而快速冪能把時間複雜度降到o logn 舉個例子 求5的13次方 思想首先把13化為二進位制 1101,即13 1101 8 1 4 1 2 0 1 1 即5 13 58 1 54 1 52 0 5 1 15 5 8 1 5 4 1 5 2 0 5 ...