题目大意&&思路:
首先,我们要构造出一个合适的矩阵运算式。下面是其中一种选择方案:
很显然,这是一个递归定义式。我们可以进一步进行转化。
.
斐波那契项:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, …
输出矩阵第二项
AC program:(朴素模拟)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
struct matrix
{
int a,b,c,d;
}ju,tmp,tmppp;
matrix fn(matrix k,matrix g)
{
matrix kg;
kg.a=((k.a*g.a)%10000+(k.b*g.c)%10000 )%10000; ///
kg.b=((k.a*g.b)%10000+(k.b*g.d)%10000 )%10000;
kg.c=((k.c*g.a)%10000+(k.d*g.c)%10000 )%10000;
kg.d=((k.c*g.b)%10000+(k.d*g.d)%10000 )%10000;
return kg;
}
matrix qmod(int r)
{
if(r==1)return ju;
tmp=qmod(r/2);
tmppp=fn(tmp,tmp);
if(r&1)return fn(tmppp,ju);
return tmppp;
}
int main()
{
ju.a=1;
ju.b=1;
ju.c=1;
ju.d=0;
int n;
while(cin>>n,n!=-1)
{
if(n==0){cout<<0<<endl;continue;}
matrix result=qmod(n);
cout<<result.b<<endl;
}
return 0;}
修改一下矩阵运算(用循环模拟矩阵运算)的函数:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<iomanip>
using namespace std;
struct matrix
{
int mm[3][3];
}tmp,ans,ju;
matrix fn(matrix uu,matrix vv)
{
matrix kg;
memset(kg.mm,0,sizeof(kg.mm));
for(int i=1;i<=2;i++)
for(int k=1;k<=2;k++)
for(int g=1;g<=2;g++)
{
kg.mm[i][g]=(kg.mm[i][g]+uu.mm[i][k]*vv.mm[k][g])%10000;
}
//cout<<"kg.mm[1][1] kg.mm[1][2] kg.mm[2][1] kg.mm[2][2] " <<kg.mm[1][1]<<" "<< kg.mm[1][2]<<" "<< kg.mm[2][1]<<" "<< kg.mm[2][2]<<endl;
return kg;
}
matrix qmod(int r)
{
if(r==1)return ju;
tmp=qmod(r/2);
ans=fn(tmp,tmp);
if(r&1)return fn(ans,ju);
return ans;
}
int main ()
{
ju.mm[1][1]=1;
ju.mm[1][2]=1;
ju.mm[2][1]=1;
ju.mm[2][2]=0;
int n;
while(cin>>n,n!=-1)
{
if(n==0){cout<<0<<endl;continue;}
matrix result=qmod(n);
cout<<result.mm[1][2]<<endl;
}
return 0;}