1. 程式人生 > 實用技巧 >Fibonacci 前 n 項和

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; }