Description
In the Fibonacci integer sequence, F0 = 0, F1 = 1, andFn = Fn − 1 + Fn − 2 forn ≥ 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 ofFn are all zeros, print ‘0’; otherwise, omit any leading zeros (i.e., printFn mod 10000).
Sample Input
0 9 999999999 1000000000 -1
Sample Output
0 34 626 6875
Hint
As a reminder, matrix multiplication is associative, and the product of two 2 × 2 matrices is given by
.
Also, note that raising any 2 × 2 matrix to the 0th power gives the identity matrix:
.
矩阵快速幂模板题。一次过。
#include <stdio.h>
#include <string.h>
#define N 2
#define MOD 10000
int n=2,s;
typedef struct Matrix{
long long mat[N][N];
Matrix operator*(const Matrix m)const{
Matrix tmp;
for(int i = 0;i < n;i++){
for(int j = 0;j < n;j++){
tmp.mat[i][j] = 0;
for(int k = 0;k < n;k++){
tmp.mat[i][j] += mat[i][k]*m.mat[k][j]%MOD;
tmp.mat[i][j] %= MOD;
}
}
}
return tmp;
}
}Matrix;
long long Pow(Matrix &m,int k){
Matrix ans;
ans.mat[0][0]=ans.mat[0][1]=ans.mat[1][0]=1;
ans.mat[1][1]=0;
while(k){
if(k&1) ans = ans*m;
k >>= 1;
m = m*m;
}
return ans.mat[0][1];
}
Matrix a;
int main()
{
while(scanf("%d",&s)>0&&s!=-1)
{
if (!s)
{
printf("0\n");
continue;
}
a.mat[0][0]=a.mat[0][1]=a.mat[1][0]=1;
a.mat[1][1]=0;
printf("%lld\n",Pow(a,s-1));
}
return 0;
}