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=fn−1+fn−2。
现在问题很简单,输入n和m,求\{f_n \}{fn}的前n项和S_n \bmod mSnmodm。
现在问题很简单,输入n和m,求\{f_n \}{fn}的前n项和S_n \bmod mSnmodm。
输入描述:
输入n,m。
输出描述:
输出前n项和S_n \bmod mSnmodm。
备注:
对于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; }