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

每日一练社区's avatar
每日一练社区 已提交
3
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
每日一练社区's avatar
每日一练社区 已提交
4

每日一练社区's avatar
每日一练社区 已提交
5
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
6 7

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

每日一练社区's avatar
每日一练社区 已提交
9
输入包含一个整数n。  
每日一练社区's avatar
每日一练社区 已提交
10

每日一练社区's avatar
每日一练社区 已提交
11
输出格式  
每日一练社区's avatar
每日一练社区 已提交
12

每日一练社区's avatar
每日一练社区 已提交
13
输出一行,包含一个整数,表示Fn除以10007的余数。  
每日一练社区's avatar
每日一练社区 已提交
14

每日一练社区's avatar
每日一练社区 已提交
15
说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。
16 17

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

每日一练社区's avatar
每日一练社区 已提交
19 20 21
```
10
```
每日一练社区's avatar
每日一练社区 已提交
22

23
**样例输出**
F
fix bug  
feilong 已提交
24

每日一练社区's avatar
每日一练社区 已提交
25 26 27
```
55
```
每日一练社区's avatar
每日一练社区 已提交
28

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

每日一练社区's avatar
每日一练社区 已提交
31 32 33
```
22
```
每日一练社区's avatar
每日一练社区 已提交
34

35
**样例输出**
F
fix bug  
feilong 已提交
36

每日一练社区's avatar
每日一练社区 已提交
37 38 39
```
7704
```
每日一练社区's avatar
每日一练社区 已提交
40

41
**数据规模与约定**
F
fix bug  
feilong 已提交
42

每日一练社区's avatar
每日一练社区 已提交
43 44 45 46
```
1 <= n <= 1,000,000。
```

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

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

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

每日一练社区's avatar
每日一练社区 已提交
53
```c
每日一练社区's avatar
每日一练社区 已提交
54 55
#include <bits/stdc++.h>
using namespace std;
每日一练社区's avatar
每日一练社区 已提交
56
```
每日一练社区's avatar
每日一练社区 已提交
57

每日一练社区's avatar
每日一练社区 已提交
58
### after
F
fix bug  
feilong 已提交
59

每日一练社区's avatar
每日一练社区 已提交
60
```c
每日一练社区's avatar
每日一练社区 已提交
61 62 63 64

```

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

每日一练社区's avatar
每日一练社区 已提交
66
```c
每日一练社区's avatar
每日一练社区 已提交
67
int fib(int n)
每日一练社区's avatar
每日一练社区 已提交
68
{
每日一练社区's avatar
每日一练社区 已提交
69 70
    if (n < 3)
        return 1;
每日一练社区's avatar
每日一练社区 已提交
71
    else
每日一练社区's avatar
每日一练社区 已提交
72 73 74 75 76 77 78
        return fib(n - 1) + fib(n - 2);
}
int main()
{
    int n;
    cin >> n;
    cout << fib(n) % 10007 << endl;
每日一练社区's avatar
每日一练社区 已提交
79 80 81 82 83
    return 0;
}
```
## 选项

F
fix bug  
feilong 已提交
84

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

每日一练社区's avatar
每日一练社区 已提交
87
```c
每日一练社区's avatar
每日一练社区 已提交
88
int fib(int N)
每日一练社区's avatar
每日一练社区 已提交
89
{
每日一练社区's avatar
每日一练社区 已提交
90 91 92 93 94 95
    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
每日一练社区 已提交
96
    {
每日一练社区's avatar
每日一练社区 已提交
97 98 99
        int c = (a + b) % 10007;
        a = b;
        b = c;
每日一练社区's avatar
每日一练社区 已提交
100
    }
每日一练社区's avatar
每日一练社区 已提交
101 102 103 104 105 106 107 108 109
    return b;
}
int main()
{
    int n;
    cin >> n;

    cout << fib(n) << endl;

每日一练社区's avatar
每日一练社区 已提交
110 111 112 113 114
    return 0;
}
```

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

每日一练社区's avatar
每日一练社区 已提交
116
```c
每日一练社区's avatar
每日一练社区 已提交
117 118 119 120 121 122 123 124 125 126
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
每日一练社区 已提交
127
        b = a[i];
每日一练社区's avatar
每日一练社区 已提交
128 129 130 131 132 133 134 135 136 137
    }
    if (n > 2)
        printf("%d", b);
    else
        printf("1");
    return 0;
}
```

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

每日一练社区's avatar
每日一练社区 已提交
139
```c
每日一练社区's avatar
每日一练社区 已提交
140 141 142 143 144 145 146 147 148 149 150 151
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
每日一练社区 已提交
152 153
int main()
{
每日一练社区's avatar
每日一练社区 已提交
154 155 156 157
    meter(1000000);
    int n;
    cin >> n;
    cout << f[n];
每日一练社区's avatar
每日一练社区 已提交
158 159 160
    return 0;
}
```