hdu5015 矩阵快速幂233(好题)
生活随笔
收集整理的這篇文章主要介紹了
hdu5015 矩阵快速幂233(好题)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ? 給你一個(n+1)*(m+1)的矩陣mat,然后給你mat[0][1] = 233 ,mat[0][2] =?2333,mat[0][3] = 23333...,然后輸入mat[1][0] ,mat[2][0] ,mat[3][0]....然后給了矩陣中的其他數值是mat[i][j] = mat[i-1][j] + mat[i][j-1],最后讓你輸出mat[n][m]。
思路:
? ?其中n <= 10 m <= 10^9 ,直接暴力果斷超時,這個題目我們要仔細觀察,n <= 10這個很重要,太大的話就不好弄了。這個題目我們可以用矩陣快速冪去做,構造一個n+2的矩陣
:
? a[1] a[2] a[n] 233 3 ? ? ? 1 ?1 ?1 ?0 0 ? ? ?a[1] a[2] a[n] 2333 3?
? ? ? ? ? ? ? ? ? ? ? ? ?* ? 0 ?1 ?1 ?0 0 ? =
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0 ?0 ?1 ?0 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 ?1 ?1 10 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0 ?0 ?0 ?1 1
? ? ? 給你一個(n+1)*(m+1)的矩陣mat,然后給你mat[0][1] = 233 ,mat[0][2] =?2333,mat[0][3] = 23333...,然后輸入mat[1][0] ,mat[2][0] ,mat[3][0]....然后給了矩陣中的其他數值是mat[i][j] = mat[i-1][j] + mat[i][j-1],最后讓你輸出mat[n][m]。
思路:
? ?其中n <= 10 m <= 10^9 ,直接暴力果斷超時,這個題目我們要仔細觀察,n <= 10這個很重要,太大的話就不好弄了。這個題目我們可以用矩陣快速冪去做,構造一個n+2的矩陣
:
? a[1] a[2] a[n] 233 3 ? ? ? 1 ?1 ?1 ?0 0 ? ? ?a[1] a[2] a[n] 2333 3?
? ? ? ? ? ? ? ? ? ? ? ? ?* ? 0 ?1 ?1 ?0 0 ? =
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0 ?0 ?1 ?0 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1 ?1 ?1 10 0
? ? ? ? ? ? ? ? ? ? ? ? ? ? ?0 ?0 ?0 ?1 1
提示下,矩陣這么建的原因是比如當前的a[3] = 上一步的 a[1] + a[2] + a[3] + 233..ok
#include<stdio.h> #include<string.h>#define MOD 10000007 typedef struct {__int64 mat[15][15]; }A;A mat_mat(A a ,A b ,int n) {A c;memset(c.mat ,0 ,sizeof(c.mat));for(int k = 1 ;k <= n ;k ++)for(int i = 1 ;i <= n ;i ++)if(a.mat[i][k])for(int j = 1 ;j <= n ;j ++)c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;return c; }A quick_mat(A a ,int b ,int n) {A c;memset(c.mat ,0 ,sizeof(c.mat));for(int i = 1 ;i <= n ;i ++)c.mat[i][i] = 1;while(b){if(b&1) c = mat_mat(c ,a ,n);a = mat_mat(a ,a ,n);b >>= 1;}return c; }int main () {int i ,j ,n ,m;A GZ;int num[15];while(~scanf("%d %d" ,&n ,&m)){for(i = 1 ;i <= n ;i ++)scanf("%d" ,&num[i]);memset(GZ.mat ,0 ,sizeof(GZ.mat));for(j = 1 ;j <= n ;j ++){ for(i = 1 ;i <= j ;i ++) GZ.mat[i][j] = 1;GZ.mat[n+1][j] = 1;}GZ.mat[n+1][n+1] = 10;GZ.mat[n+2][n+1] = GZ.mat[n+2][n+2] = 1;A now = quick_mat(GZ ,m ,n + 2);__int64 Ans = 0;for(i = 1 ;i <= n ;i ++)Ans = (Ans + num[i] * now.mat[i][n]) % MOD;Ans = (Ans + 233 * now.mat[n+1][n] + 3 * now.mat[n+2][n]) % MOD;printf("%I64d\n" ,Ans);}return 0; }
總結
以上是生活随笔為你收集整理的hdu5015 矩阵快速幂233(好题)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: hdu4998 旋转坐标系
- 下一篇: hdu4993(水题)