就是个斐波那契数列,不过用的是矩阵快速幂算法。
用的是结构体存矩阵,容易返回,在每个函数中建立矩阵,不要在全局变量中定义一个矩阵,不然会在某个函数中会修改,
当函数传的是数组的时候,函数外面的数组的值会发生改变,因为数组名是一个指针。
#include <bits/stdc++.h> using namespace std; typedef long long ll; struct node{ ll a[3][3]; }; node mul(node A,node B){ node C; memset(C.a,0,sizeof(C.a)); //清零,超级重要。 for (int i = 0; i < 2; i++) for (int j = 0; j < 2; j++) for (int k = 0; k < 2; k++) C.a[i][j] = (C.a[i][j] + A.a[i][k]*B.a[k][j])%10000; return C; // 一定不要忘了返回, } node pow(node A,int n){ node B; memset(B.a,0,sizeof(B.a)); for (int i = 0; i < 2; i++) B.a[i][i] = 1; //单位矩阵 while(n){ if (n & 1) B = mul(B,A); A = mul(A,A); n >>= 1; } return B; // 一定不要忘了返回, } int main() { int n; node res; while(scanf("%d",&n)){ if (n == -1) break; if (n == 0) { printf("%d\n",0); continue; } res.a[0][0] = 1; res.a[0][1] = 1; res.a[1][0] = 1; res.a[1][1] = 0; res = pow(res,n); printf("%lld\n",res.a[1][0]); } return 0; }