#include<bits/stdc++.h>
using namespace std;
//mod大P
typedef long long LL;
LL P;
/*定义矩阵*/
struct juzhen {
LL elem[10][10];
}jz, danwei;
/*初始化1 1 1 0矩阵和单位矩阵*/
void init() {
jz.elem[0][0] = 1;
jz.elem[0][1] = 1;
jz.elem[1][0] = 1;
jz.elem[1][1] = 0;
for (int i = 0; i < 2; i++)
for (int j = 0; j < 2; j++)
danwei.elem[i][j] = (i == j);
}
/*矩阵相乘函数*/
juzhen multi(juzhen a, juzhen b) {
juzhen result;
for (int i = 0; i < 2; i++) {
for (int j = 0; j < 2; j++) {
result.elem[i][j] = 0;
for (int k = 0; k < 2; k++) {
result.elem[i][j] += (a.elem[i][k] * b.elem[k][j]) % P;
result.elem[i][j] %= P;
}
}
}
return result;
}
/*分治法矩阵快速幂*/
juzhen power(LL n) {
juzhen res = danwei;
juzhen a = jz;
while (n > 0) {
if (n & 1)
res = multi(a, res);
a = multi(a, a);
n>>=1;
}
return res;
}
int main()
{
LL n;
cin >> n >> P;
init();
juzhen ans=power(n - 1);
cout << ans.elem[0][0]<<endl;
return 0;
}
斐波那契数列第n项mod大数
最新推荐文章于 2024-07-25 17:54:26 发布