原题链接:蓝桥杯算法提高VIP-矩阵乘方
解题思路: 递归
注意事项:
参考代码:
#include<iostream> using namespace std; int a[2][2]; int b, m; int sum; void mul(int e[][2], int d[][2], int m) { // cout<<"调用乘法"<<endl; int c[2][2]; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { sum=0; for(int k=0; k<2; k++) sum+=e[i][k]*d[k][j]; c[i][j]=sum % m; } } for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { a[i][j] = c[i][j]; } } return ; } void fun(int a[][2], int b, int m) { if(b == 0) { // cout<<"调用1"<<endl; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { if(i == j) a[i][j] = 1%m; else a[i][j] = 0; } } return ; } if(b%2==1) { // cout<<"调用2"<<endl; int c[2][2]; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { c[i][j] = a[i][j]; } } fun(a,b-1,m); mul(a,c,m); return ; } else { // cout<<"调用3"<<endl; fun(a,b/2,m); mul(a,a,m); return ; } return; } int main() { cin>>b>>m; for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { cin>>a[i][j]; } } fun(a, b, m); for(int i = 0; i < 2; i++) { for(int j = 0; j < 2; j++) { cout<<a[i][j]<<' '; } cout<<endl; } return 0; }
0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复