Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 17928 | Accepted: 12470 |
Description
In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
An alternative formula for the Fibonacci sequence is
.
Given an integer n, your goal is to compute the last 4 digits of Fn.
Input
The input test file will contain multiple test cases. Each test case consists of a single line containing n (where 0 ≤ n ≤ 1,000,000,000). The end-of-file is denoted by a single line containing the number −1.
Output
For each test case, print the last four digits of Fn. If the last four digits of Fn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., print Fn mod 10000).
Sample Input
0 9 999999999 1000000000 -1
Sample Output
0 34 626 6875
题目意思很清楚了 直接套模板就可以了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#define _rep(i, a, b) for(int i = a; i <= b; i++)
#define _for(i, a, b) for(int i = a; i < b; i++)
#define M_sel *this
using namespace std;
typedef vector<int> vec_int;
typedef vector<vec_int> mat_int;
typedef long long ll;
const int Maxn = 1010;
const int Maxm = 1010;
const int Mod = 10000;
struct Matrix {
int n, m;
mat_int a;
Matrix(int n = 0, int m= 0) {
this->n = n; this->m = m;
vec_int tmp;
tmp.assign(m, 0);
_for(i, 0, n)
a.push_back(tmp);
}
void clear(){
_for(i, 0, n)
a.clear();
n = m = 0;
}
Matrix operator + (const Matrix &b) const {
Matrix tmp(n, m);
_for(i, 0, n)
_for(j, 0, m)
tmp.a[i][j] = a[i][j] + b.a[i][j];
return tmp;
}
Matrix operator - (const Matrix &b) const {
Matrix tmp(n, m);
_for(i, 0, n)
_for(j, 0, m)
tmp.a[i][j] = a[i][j] - b.a[i][j];
return tmp;
}
Matrix operator * (const Matrix &b) const {
Matrix tmp(n, b.m);
_for(i, 0, n)
_for(j, 0, b.m)
_for(k, 0, m)
tmp.a[i][j] = (tmp.a[i][j] + a[i][k] * b.a[k][j] % Mod) % Mod;//Mod在外部设置,主要是为了方便求快速幂;
return tmp;
}
Matrix pow(ll b) {
Matrix tmp(n, m);
_for(i, 0, n)
tmp.a[i][i] = 1;
while (b) {
//if (b & 1) tmp = (*this) * tmp;
//(*this) = (*this) * (*this);
if (b & 1) tmp = M_sel * tmp; //指针和乘号放在一起很难受, 在上面开了个宏定义
M_sel = M_sel * M_sel;
b >>= 1;
}
return tmp;
}
};
ll n;
int main() {
#ifdef ZTZTMS
freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
#endif
Matrix A(2, 2);
A.a[0][0] = 1; A.a[0][1] = 1;
A.a[1][0] = 1; A.a[1][1] = 0;
while (~scanf("%lld", &n) && n >= 0) {
Matrix ans = A.pow(n);
printf("%d\n", ans.a[1][0]);
}
return 0;
}