# ZeroJudge - f738: 老鼠的數列
### 題目連結:https://zerojudge.tw/ShowProblem?problemid=f738
###### tags: `ZeroJudge` `輸出入最佳化` `編譯器最佳化`
```cpp=
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector")
#include <iostream>
using namespace std;
#define MOD 1000000007
char ReadChar() {
static int counts = 1 << 16;
static const int length = 1 << 15;
static char buffer[length];
static char *pointer = buffer, *end = buffer;
if (pointer == end) {
if (counts < length)
return EOF;
counts = fread(buffer, 1, length, stdin);
end = buffer + counts;
pointer = buffer;
}
return *(pointer++);
}
template <class type>
bool ReadNumber(type *number) {
static char buffer;
while ((buffer = ReadChar()) < '-')
if (buffer == EOF)
return false;
*number = buffer - '0';
while ((buffer = ReadChar()) >= '0')
*number = (*number << 3) + (*number << 1) + buffer - '0';
return true;
}
class Printer {
public:
static const int length = 1 << 16;
char buffer[length], *pointer, *end;
Printer():pointer(buffer), end(pointer + length - 1) {}
~Printer() {
*pointer = '\0', printf("%s", buffer);
}
void PrintNumber(int number) {
static char digits[12];
int index = 0;
digits[index] = '\n'; ++index;
if (!number) {
*(digits + index) = '0';
++index;
}
while (number) {
*(digits + index) = (number % 10) + '0';
++index;
number /= 10;
}
while (index) {
if (pointer == end) {
*pointer = '\0';
printf("%s", buffer);
pointer = buffer;
}
--index; *pointer = *(digits + index); ++pointer;
}
}
} *printer = new Printer();
int lucas[1000001] = { 2, 1, 3 };
void Initialize() {
for (int i = 3; i <= 1000000; ++i)
lucas[i] = (lucas[i - 2] + lucas[i - 1]) % MOD;
}
int main() {
cin.sync_with_stdio(false); cin.tie(nullptr);
int times, term;
Initialize();
while (ReadNumber(&term))
printer->PrintNumber(*(lucas + term));
delete printer;
}
```