这里会显示出您选择的修订版和当前版本之间的差别。
| 后一修订版 | 前一修订版 | ||
|
2020-2021:teams:no_morning_training:weekly:week9 [2020/07/31 09:39] shaco 创建 |
2020-2021:teams:no_morning_training:weekly:week9 [2020/07/31 16:15] (当前版本) 发源于 |
||
|---|---|---|---|
| 行 6: | 行 6: | ||
| ===== 王瑞琦 ===== | ===== 王瑞琦 ===== | ||
| ===比赛=== | ===比赛=== | ||
| + | 无 | ||
| ===专题=== | ===专题=== | ||
| + | 无 | ||
| ===== 冯宇扬 ===== | ===== 冯宇扬 ===== | ||
| + | ===比赛=== | ||
| + | cf 659 div 2\\ | ||
| + | [[2020-2021:teams:no_morning_training:fayuanyu:cf_r660d2|cf 660 div 2]] | ||
| ===== 常程 ===== | ===== 常程 ===== | ||
| ===比赛=== | ===比赛=== | ||
| 行 17: | 行 22: | ||
| ===== 本周推荐 ===== | ===== 本周推荐 ===== | ||
| ==== 王瑞琦 ==== | ==== 王瑞琦 ==== | ||
| - | ==== 冯宇扬 ==== | + | 写了一道矩阵快速幂的模板题。 |
| - | ==== 常程 ==== | + | ===来源=== |
| - | === 来源 === | + | 洛谷P3390:[[https://www.luogu.com.cn/problem/P3390|【模板】矩阵快速幂]] |
| - | === 标签 === | + | ===标签=== |
| - | === 题意 === | + | 数学,矩阵乘法 |
| - | === 思路 === | + | ===题意=== |
| - | <hidden code> | + | 给出一个n*n的矩阵,计算其的k次方 |
| - | <code cpp> | + | ===题解=== |
| + | 对矩阵运用快速幂=。=\\ | ||
| + | 快速幂:\\ | ||
| + | 对于n的k次方,可以不需要计算k次,只需计算出n^(k/2),然后再开方即可(对于k为奇的情况要再乘一个n)\\ | ||
| + | 可以将复杂度降到O(logn)\\ | ||
| + | <hidden 代码> | ||
| + | <code c> | ||
| + | #include <stdio.h> | ||
| + | #define p 1000000007 | ||
| + | struct matrix{ | ||
| + | long long m[101][101]; | ||
| + | }; | ||
| + | typedef struct matrix Matrix; | ||
| + | long long n; | ||
| + | |||
| + | Matrix work(Matrix a,Matrix b) | ||
| + | { | ||
| + | Matrix tmp; | ||
| + | for (long long i=1;i<=n;i++) | ||
| + | for (long long j=1;j<=n;j++) | ||
| + | { | ||
| + | tmp.m[i][j]=0; | ||
| + | for (long long k=1;k<=n;k++) | ||
| + | tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%p; | ||
| + | } | ||
| + | return tmp; | ||
| + | } | ||
| + | |||
| + | Matrix ksm(Matrix a,long long m) | ||
| + | { | ||
| + | Matrix tmp=a,b=a; | ||
| + | m--; | ||
| + | while (m>0) | ||
| + | { | ||
| + | if (m%2==1) tmp=work(b,tmp); | ||
| + | b=work(b,b); | ||
| + | m=m/2; | ||
| + | } | ||
| + | return tmp; | ||
| + | } | ||
| + | |||
| + | int main() | ||
| + | { | ||
| + | long long k; | ||
| + | Matrix a; | ||
| + | scanf("%lld%lld",&n,&k); | ||
| + | for (long long i=1;i<=n;i++) | ||
| + | for (long long j=1;j<=n;j++) scanf("%lld",&a.m[i][j]); | ||
| + | a=ksm(a,k); | ||
| + | for (long long i=1;i<=n;i++) | ||
| + | { | ||
| + | for (long long j=1;j<=n;j++) | ||
| + | printf("%lld ",a.m[i][j]); | ||
| + | printf("\n"); | ||
| + | } | ||
| + | return 0; | ||
| + | } | ||
| </code> | </code> | ||
| </hidden> | </hidden> | ||
| - | === comment === | + | ===comment=== |
| + | 一道模板题。矩阵快速幂的运用范围还是挺广的。 | ||
| + | |||
| + | ==== 冯宇扬 ==== | ||
| + | 就[[2020-2021:teams:no_morning_training:fayuanyu:cf_r660d2|cf 660 div 2]]吧 | ||
| + | ==== 常程 ==== | ||
| + | 本周摸了 | ||