【题目链接】
【算法】
矩阵乘法快速幂
【代码】
#include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> #include <exception> #include <fstream> #include <functional> #include <limits> #include <list> #include <map> #include <iomanip> #include <ios> #include <iosfwd> #include <iostream> #include <istream> #include <ostream> #include <queue> #include <set> #include <sstream> #include <stdexcept> #include <streambuf> #include <string> #include <utility> #include <vector> #include <cwchar> #include <cwctype> #include <stack> #include <limits.h> using namespace std; const long long MOD = 10000; long long n; struct Matrix { long long n,m; long long mat[5][5]; } ans; inline void multipy(Matrix &a,Matrix b) { long long i,j,k; Matrix ans; ans.n = a.n; ans.m = b.m; memset(ans.mat,0,sizeof(ans.mat)); for (i = 1; i <= a.n; i++) { for (j = 1; j <= b.m; j++) { for (k = 1; k <= a.m; k++) { ans.mat[i][j] = (ans.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD; } } } a = ans; } inline void power(Matrix &a,long long n) { Matrix p,ans; p.n = p.m = 2; p.mat[1][1] = 1; p.mat[1][2] = 1; p.mat[2][1] = 1; p.mat[2][2] = 0; ans.n = ans.m = 2; ans.mat[1][1] = 1; ans.mat[1][2] = 0; ans.mat[2][1] = 0; ans.mat[2][2] = 1; while (n > 0) { if (n & 1) multipy(ans,p); n >>= 1; multipy(p,p); } a = ans; } inline void solve() { Matrix tmp; tmp.n = 2; tmp.m = 1; tmp.mat[1][1] = 1; tmp.mat[2][1] = 0; ans.n = ans.m = 2; ans.mat[1][1] = ans.mat[1][2] = ans.mat[2][1] = 1; ans.mat[2][2] = 0; power(ans,n-1); multipy(ans,tmp); cout<< ans.mat[1][1] << endl; } int main() { while (scanf("%lld",&n) != EOF && n != -1) { if (!n) cout<< 0 << endl; else if (n == 1) cout<< 1 << endl; else solve(); } return 0; }