ll n, m;
void mul(ll c[], ll a[],ll b[][3])
{
ll tmp[3] = {0};
f(i, 0, 2)
f(j, 0, 2)tmp[i] = (tmp[i] + a[j] * b[j][i]) % m;
memcpy(c, tmp,sizeof tmp);
}
void mul(ll c[][3], ll a[][3], ll b[][3])
{
ll tmp[3][3] = {0};
f(i, 0, 2)
f(j, 0, 2)
f(k, 0, 2)tmp[i][j] = (tmp[i][j] + a[i][k] * b[k][j]) % m;
memcpy(c, tmp, sizeof tmp);
}
void Matrix_power(ll s[], ll a[][3])
{
while (n)
{
if (n & 1)mul(s, s, a);
mul(a, a, a);
n >>=1;
}
}
int main()
{
//freopen("in.txt", "r", stdin);
while (cin >> n >> m)
{
ll f1[3] = { 1,1,1 };
ll A[3][3]= { {0,1,0},{1,1,1},{0,0,1} };
n--;
Matrix_power(f1, A);
cout << f1[2] << endl;
}
return 0;
}
AcWing 1303. 斐波那契前 n 项和(矩阵幂取模板子题)
最新推荐文章于 2021-11-22 19:13:59 发布