板子代码(其余的题构造出矩阵代入,改下计算的结果就行)
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define mod 10000
struct node
{
long long m[2][2];//根据构造的矩阵而定数组的大小
} a;
node c=//构造的矩阵
{
1,1,
1,0
};
node juzhen(node k,node b)//矩阵快速幂
{
node h;
memset(h.m,0,sizeof(h.m));
for(int i=0; i<2; i++)
{
for(int j=0; j<2; j++)
{
for(int z=0; z<2; z++)
h.m[i][j]+=(k.m[i][z]%mod)*(b.m[z][j]%mod)%mod;
}
}
return h;
}
//如果题目卡时间的话,可以用下面的代码,
//node juzhen(node k,node b)
//{
// node h;
// memset(h.m,0,sizeof(h.m));
// for(int i=0; i<2; i++)
// {
// for(int j=0; j<2; j++)
// {
// if(k.m[i][j])//剪枝
// {
// for(int z=0; z<2; z++)
// h.m[i][z]+=(k.m[i][j]%mod)*(b.m[j][z]%mod)%mod;
// }
// }
// }
// return h;
//}
node mul(node b,long long n)
{
node ans=b,k=c;
while(n)
{
if(n%2==1)
{
ans=juzhen(ans,k);
}
n/=2;
k=juzhen(k,k);
}
return ans;
}
int main()
{
long long n;
while(~scanf("%lld",&n)&&n!=-1)
{
if(n==0)
printf("0\n");
else if(n==1)
printf("1\n");
else
{
node a;
memset(a.m,0,sizeof(a.m));
for(int i=0; i<2; i++)
a.m[i][i]=1;
node d=mul(a,n-1);
printf("%lld\n",d.m[0][0]%mod);
}
}
return 0;
}
1.矩阵一般要连续的,比如n,n-1,n-2,,,,,诸如此类,说一个典型的构造
构造这个函数时,不能简单的构造个2*1的【】矩阵,应该构造3*1的【】的矩阵,如图
1 0 1 f(n-1) f(n)
1 0 0 * f(n-2) = f(n-1)
0 1 0 f(n-3) f(n-3)
2.构造矩阵时有时候有必要加入常数,构造
构造这个矩阵可以构造3*1的【】矩阵,如图
1 1 1 f(n-1) f(n)
1 0 0 * f(n-2) = f(n-1)
0 0 1 p p
3.构造矩阵的时候必要时进行拆分,比如,把n^4进行拆分。(面这个是偷来的,有点懒啊啊啊啊,无视这里)
4.有时候构造的矩阵里面不只有这一种变量f(n),还可能有多种变量,例如下面这道题https://vjudge.net/contest/242514#problem/F,
这道题假设第n个图中朝上的三角形个数为f(n),第n个图中朝下的三角形个数为g(n)。构造矩阵如图
3 1 f(n-1) f(n)
1 3 * g(n-1) = g(n),
求f(n)即可
就这样吧,我再碰到好的构造再补充,,,