设斐波那契数列 f 1 = 1 , f 2 = 1 , f 3 = 2... f1=1,f2=1,f3=2... f1=1,f2=1,f3=2... 求 S n m o d m S_n \ mod\ m Sn mod m的值
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 3;
int n,m;
void mul(int c[], int a[], int b[][N])
{
int tmp[N] = {0};
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
tmp[j] = (tmp[j] + (ll)a[i] * b[i][j]) % m;
for(int i=0;i<N;i++) c[i] = tmp[i];
}
void mul(int c[][N], int a[][N], int b[][N])
{
int tmp[N][N] = {0};
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
for(int k=0;k<N;k++)
tmp[i][j] = (tmp[i][j] + (ll)a[i][k] * b[k][j]) % m;
for(int i=0;i<N;i++)
for(int j=0;j<N;j++)
c[i][j] = tmp[i][j];
}
int main()
{
int f[N] = {1, 1, 1};
int a[N][N] = {
{0, 1, 0},
{1, 1, 1},
{0, 0, 1}
};
scanf("%d%d",&n,&m);
n--;
while(n)
{
if(n & 1) mul(f, f, a);
mul(a, a, a);
n >>= 1;
}
printf("%d\n",f[2]);
return 0;
}