版权声明:请大家斧正,如喜欢的话,为拙见点一个赞吧。 https://blog.csdn.net/qq_39897867/article/details/82024689
题目
http://poj.org/problem?id=3070
https://www.luogu.org/problemnew/show/P1962
解题思路
矩阵乘法:
设
是
矩阵,
是
矩阵,则
是
矩阵,并且
:
因为矩阵乘法满足结合律,所以我们可以用快速幂计算【否则,矩阵乘法是一个很没有的东西~~至少我这么认为!!!】。
代码(poj_code)
注意:与luogu的不一样
#include<cstdio>
#include<cstring>
#define WYC 10000
#define w 2
#define rep(i,x,y) for(register int i=x;i<y;i++)
using namespace std;
int n,f[w],a[w][w];
void mull()
{
int c[w][w]={{0,0},{0,0}};
rep(i,0,w) rep(j,0,w) rep(k,0,w)
c[i][j]=(c[i][j]+(long long)a[i][k]*a[k][j])%WYC;
memcpy(a,c,sizeof(c));
}
void mul()
{
int c[w]={0,0};
rep(j,0,w) rep(k,0,w)
c[j]=(c[j]+(long long)f[k]*a[k][j])%WYC;
memcpy(f,c,sizeof(c));
}
int main()
{
while (scanf("%d",&n)&&n!=-1)
{
f[0]=0; f[1]=1;
a[0][0]=0; a[0][1]=1; a[1][0]=1; a[1][1]=1;
for(;n;mull(),n>>=1) if (n&1) mul();
printf("%d\n",f[0]);
}
}