給定長度為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);i第二行n個整數表示a陣列(0 <= a
<= 1,000,000,000)。
一行n個整數表示答案。示例1
3 11 2 3
1 3 6
示例2
5 03 14 15 92 6
3 14 15 92 6mat operator * (mat & a)這題非常容易找到矩陣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了
}return ans;
}由於規律性非常明顯,所以可以用乙個一維陣列儲存
然後就是常規的矩陣快速冪操作。不過這題他們說有其他的解法
找規律好像可以做,但是我不會。
只能想到矩陣快速冪的方法
矩陣快速冪有點慢,不過能ac也ok
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7 #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 ...