Fibonacci 前 n 项和

题目描述 

大家都知道Fibonacci数列吧,f_1=1,f_2=1,f_3=2,f_4=3,…,f_n=f_{n-1}+f_{n-2}f1=1,f2=1,f3=2,f4=3,,fn=fn1+fn2
现在问题很简单,输入n和m,求\{f_n \}{fn}的前n项和S_n \bmod mSnmodm。

输入描述:

输入n,m。

输出描述:

输出前n项和S_n \bmod mSnmodm。
示例1

输入

复制
5 1000

输出

复制
12

备注:

对于100 \%100%的数据,1 \leq n \leq 2 \times10^9,1 \leq m \leq 10^9+101n2×109,1m109+10。

//S(n) = F(n + 2) - 1
#include<bits/stdc++.h>
using namespace std;
void mul(int f[2], int a[2][2], int mod) {
    int c[2];
    memset(c, 0, sizeof(c));
    for (int j = 0; j < 2; j++) {
        for (int k = 0; k < 2; k++) {
            c[j] = (c[j] + (long long)f[k] * a[k][j]) % mod;
        }
    }
    memcpy(f, c, sizeof(c));
}
void mulself(int a[2][2], int mod) {
    int c[2][2];
    memset(c, 0, sizeof(c));
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 2; k++) {
                c[i][j] = (c[i][j] + (long long)a[i][k] * a[k][j]) % mod;
            }
        }
    }
    memcpy(a, c, sizeof(c));
}
int main() {
    int n, m;
    cin >> n >> m;
    n += 2;
    int a[2][2] = {{0, 1}, {1, 1}};
    int f[2] = {0, 1};
    while (n) {
        if (n & 1) mul(f, a, m);
        mulself(a, m);
        n >>= 1;
    }
    cout << (f[0] - 1 + m) % m << endl;
    return 0;
}
posted @ 2020-07-21 20:37  HighLights  阅读(233)  评论(0)    收藏  举报