定义 a0=1,a1=1,an = an−1 + an−2,求 an是多少。
为了避免考虑整数溢出问题,我们求 an % p 的值,p=109+7。
递归
const int mod = 1000000007;
void f(int n)
{
if (n <= 1) return 1;
return (f(n - 1) + f(n - 2)) % mod;
}
记忆化搜索
const int N = 100005;
const int mod = 1000000007;
int a[N];
int f(int n)
{
if (a[n]) return a[n];
if (n <= 1) return 1;
a[n] = f(n - 1) + f(n - 2);
a[n] %= mod;
return a[n];
}
递推
const int N = 100005, mod = 1000000007;
int f(int n)
{
a[0] = a[1] = 1;
for (int i = 2; i <= n; i ++ )
{
a[i] = a[i - 1] + a[i - 2];
a[i] %= mod;
}
return a[n];
}
递归+滚动变量
const int mod = 1000000007;
void f(int n)
{
int a, b;
a = b = 1;
for (int i = 2; i <= n; i++)
{
int c = (a + b) % mod;
a = b;
b = c;
}
}
矩阵运算 + 快速幂
typedef long long ll;
const ll mod = 100000007;
struct mat{
ll a[2][2];
};
mat poww(mat A, ll n)
{
mat res;
res.a[0][0] = 1, res.a[0][1] = 0, res.a[1][0] = 0, res.m[1][1] = 1;
while (n)
{
if (n & 1)
{
res = mul(res, A);
}
A = mul(A, A);
n >>= 1;
}
return res;
}
mat mul(mat x, mat y)
{
mat res;
memset(res.a, 0, sizeof(res.a));
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
{
for (int k = 0; k < 2; k++)
{
res.a[i][j] += x.a[i][k] * y.a[k][j] % mod;
}
}
}
return res;
}