解题思路:
注意事项:矩阵的乘法
参考代码:
#include <stdio.h>
int b, m;
int a[2][2], ans[2][2], temp[2][2] = {1,1,1,1};
void play()
{
int cnt, cnt2;
for(cnt = 0; cnt < 2; ++cnt)
{
for(cnt2 = 0; cnt2 < 2; ++cnt2)
{
printf("%d ", ans[cnt][cnt2]);
}
printf("\n");
}
}
void cp(int arr1[][2], int arr2[][2])
{
int cnt, cnt2;
for(cnt = 0; cnt < 2 ;++cnt)
for(cnt2 = 0; cnt2 < 2; ++cnt2)
arr1[cnt][cnt2] = arr2[cnt][cnt2];
}
void mod(int arr[][2])
{
int cnt, cnt2;
for(cnt = 0; cnt < 2; ++cnt)
for(cnt2 = 0; cnt2 < 2; ++cnt2)
arr[cnt][cnt2] %= m;
}
void fun2(int a[][2], int b[][2])
{
int cnt, cnt2;
temp[0][0] = a[0][0]*b[0][0]+a[0][1]*b[1][0];
temp[0][1] = a[0][0]*b[0][1]+a[0][1]*b[1][1];
temp[1][0] = a[1][0]*b[0][0]+a[1][1]*b[1][0];
temp[1][1] = a[1][0]*b[0][1]+a[1][1]*b[1][1];
}
void fun(int arr[][2], int k)
{
int cnt;
if(k == 0)
{
mod(temp);
cp(ans, temp);
return;
}
if(k == 1)
{
mod(ans);
return;
}
if(k == 2)
{
fun2(a, a);
cp(ans, temp);
// printf("2\n");
// play();
mod(ans);
return;
}
if(k%2 == 0)
{
fun(arr, k/2);
fun2(ans, ans);
cp(ans, temp);
//printf("=0\n");
//play();
mod(ans);
return;
}
if(k%2 != 0)
{
fun(arr, k-1);
fun2(ans, arr);
cp(ans, temp);
//printf("!=0\n");
// play();
mod(ans);
return;
}
}
int main()
{
int cnt, cnt2;
scanf("%d%d", &b, &m);
for(cnt = 0; cnt < 2; ++cnt)
for(cnt2 = 0; cnt2 < 2; ++cnt2)
{
scanf("%d", &a[cnt][cnt2]);
ans[cnt][cnt2] = a[cnt][cnt2];
}
fun(a, b);
play();
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复