solution.md 2.0 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1
# 斐波那契
F
fix bug  
feilong 已提交
2

每日一练社区's avatar
每日一练社区 已提交
3 4
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
5 6

**输入格式**
F
fix bug  
feilong 已提交
7

每日一练社区's avatar
每日一练社区 已提交
8 9 10 11
输入包含一个整数n。  
输出格式  
输出一行,包含一个整数,表示Fn除以10007的余数。  
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
12 13

**样例输入**
F
fix bug  
feilong 已提交
14

每日一练社区's avatar
每日一练社区 已提交
15 16 17
```
10
```
18
**样例输出**
F
fix bug  
feilong 已提交
19

每日一练社区's avatar
每日一练社区 已提交
20 21 22
```
55
```
23
**样例输入**
F
fix bug  
feilong 已提交
24

每日一练社区's avatar
每日一练社区 已提交
25 26 27
```
22
```
28
**样例输出**
F
fix bug  
feilong 已提交
29

每日一练社区's avatar
每日一练社区 已提交
30 31 32
```
7704
```
33
**数据规模与约定**
F
fix bug  
feilong 已提交
34

每日一练社区's avatar
每日一练社区 已提交
35 36 37 38
```
1 <= n <= 1,000,000。
```

每日一练社区's avatar
每日一练社区 已提交
39 40
下列哪一个选项会超时?

每日一练社区's avatar
每日一练社区 已提交
41
## aop
F
fix bug  
feilong 已提交
42

每日一练社区's avatar
每日一练社区 已提交
43
### before
F
fix bug  
feilong 已提交
44

每日一练社区's avatar
每日一练社区 已提交
45
```cpp
每日一练社区's avatar
每日一练社区 已提交
46 47
#include <bits/stdc++.h>
using namespace std;
每日一练社区's avatar
每日一练社区 已提交
48 49
```
### after
F
fix bug  
feilong 已提交
50

每日一练社区's avatar
每日一练社区 已提交
51 52 53 54 55
```cpp

```

## 答案
F
fix bug  
feilong 已提交
56

每日一练社区's avatar
每日一练社区 已提交
57
```cpp
每日一练社区's avatar
每日一练社区 已提交
58
int fib(int n)
每日一练社区's avatar
每日一练社区 已提交
59
{
每日一练社区's avatar
每日一练社区 已提交
60 61
    if (n < 3)
        return 1;
每日一练社区's avatar
每日一练社区 已提交
62
    else
每日一练社区's avatar
每日一练社区 已提交
63 64 65 66 67 68 69
        return fib(n - 1) + fib(n - 2);
}
int main()
{
    int n;
    cin >> n;
    cout << fib(n) % 10007 << endl;
每日一练社区's avatar
每日一练社区 已提交
70 71 72 73 74
    return 0;
}
```
## 选项

F
fix bug  
feilong 已提交
75

每日一练社区's avatar
每日一练社区 已提交
76
### A
F
fix bug  
feilong 已提交
77

每日一练社区's avatar
每日一练社区 已提交
78
```cpp
每日一练社区's avatar
每日一练社区 已提交
79
int fib(int N)
每日一练社区's avatar
每日一练社区 已提交
80
{
每日一练社区's avatar
每日一练社区 已提交
81 82 83 84 85 86
    if (N <= 0)
        return 0;
    if (N == 1 || N == 2)
        return 1;
    int a = 1, b = 1;
    for (int i = 3; i <= N; i++)
每日一练社区's avatar
每日一练社区 已提交
87
    {
每日一练社区's avatar
每日一练社区 已提交
88 89 90
        int c = (a + b) % 10007;
        a = b;
        b = c;
每日一练社区's avatar
每日一练社区 已提交
91
    }
每日一练社区's avatar
每日一练社区 已提交
92 93 94 95 96 97 98 99 100
    return b;
}
int main()
{
    int n;
    cin >> n;

    cout << fib(n) << endl;

每日一练社区's avatar
每日一练社区 已提交
101 102 103 104 105
    return 0;
}
```

### B
F
fix bug  
feilong 已提交
106

每日一练社区's avatar
每日一练社区 已提交
107 108 109 110 111 112 113 114 115 116 117
```cpp
int main()
{
    int n, b;
    scanf("%d", &n);
    int a[n];
    a[0] = a[1] = 1;

    for (int i = 2; i < n; i++)
    {
        a[i] = (a[i - 1] + a[i - 2]) % 10007;
每日一练社区's avatar
每日一练社区 已提交
118
        b = a[i];
每日一练社区's avatar
每日一练社区 已提交
119 120 121 122 123 124 125 126 127 128
    }
    if (n > 2)
        printf("%d", b);
    else
        printf("1");
    return 0;
}
```

### C
F
fix bug  
feilong 已提交
129

每日一练社区's avatar
每日一练社区 已提交
130
```cpp
每日一练社区's avatar
每日一练社区 已提交
131 132 133 134 135 136 137 138 139 140 141 142
int f[1000000 + 1];

void meter(int n)
{
    f[1] = 1;
    f[2] = 1;
    if (n >= 3)
        for (int i = 3; i <= n; i++)
        {
            f[i] = (f[i - 1] + f[i - 2]) % 10007;
        }
}
每日一练社区's avatar
每日一练社区 已提交
143 144
int main()
{
每日一练社区's avatar
每日一练社区 已提交
145 146 147 148
    meter(1000000);
    int n;
    cin >> n;
    cout << f[n];
每日一练社区's avatar
每日一练社区 已提交
149 150 151
    return 0;
}
```