这题其实就是斐波那契数列,但是考虑到n的范围非常大,n=1e9,我们不能直接O(n)的递推。
其实题目已经给出了解法了,就是用矩阵快速幂来实现递推,把时间复杂度降到(2^3*log2(n))。
这题可以入门矩阵快速幂,为以后的矩阵快速幂加速DP做准备。
然后这题就喜闻乐见的A掉啦。
附上AC代码:
#include <cstdio>
#include <cstring>
using namespace std;
const int n=2,mod=1e4;
struct note{
int map[3][3];
inline void reset(void){
memset(map,0,sizeof map);
for (int i=1; i<=n; ++i) map[i][i]=1;
return;
}
inline friend note operator * (note p,note q){
note sum;
for (int i=1; i<=n; ++i)
for (int j=1; j<=n; ++j){
sum.map[i][j]=0;
for (int k=1; k<=n; ++k)
sum.map[i][j]=(sum.map[i][j]+p.map[i][k]*q.map[k][j])%mod;
}
return sum;
}
}a,ans;
int m;
inline int ksm(int m){
ans.reset(),a.map[1][1]=a.map[1][2]=a.map[2][1]=1,a.map[2][2]=0;
while (m){
if (m&1) ans=ans*a;
m>>=1,a=a*a;
}
return ans.map[1][2];
}
int main(void){
for (scanf("%d",&m); ~m; scanf("%d",&m)) printf("%d\n",m==0?0:ksm(m));
return 0;
}