一.题目链接
二.思路
思路参考:https://www.acwing.com/solution/content/15132/
三.代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4;
int n, m;
void mul(int c[][N], int a[][N], int b[][N])
{
int temp[N][N] = {0};
for(int i = 0; i < N; i ++)
for(int j = 0; j < N; j ++)
for(int k = 0; k < N; k ++)
temp[i][j] = (temp[i][j] + (ll)a[i][k] * b[k][j]) % m;
memcpy(c, temp, sizeof temp);
}
int main()
{
cin >> n >> m;
//Fn = [fn, fn+1, sn, pn]
//其中pn = nsn - Tn;
//可以得到A
int f1[N][N] = {1,1,1,0};
int a[N][N] = {
{0,1,0,0},
{1,1,1,0},
{0,0,1,1},
{0,0,0,1}
};
int k = n - 1;
while(k)
{
if(k & 1) mul(f1, f1, a);
mul(a, a, a);
k >>= 1;
}
cout << (((long long) n * f1[0][2] - f1[0][3]) % m + m ) % m << endl;
return 0;
}
四.总结
- A中不能含有变量,需要通过一定的转化用一个新的量来表示,核心是递推。