Fibonacci 前 n 項和
阿新 • • 發佈:2020-07-21
題目描述
大家都知道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=fn−1+fn−2。現在問題很簡單,輸入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+101≤n≤2×109,1≤m≤109+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; }