#include<stdio.h>
//我需要构造一个结构来储存矩阵。
typedef struct {
long long a[3][3];
}matrix;
long long fastMod(long long n,long long mod){
matrix t,count;
matrix temp,count2;
t.a[1][1] = 1;
t.a[1][2] = 0;
t.a[2][1] = 0;
t.a[2][2] = 1;
temp.a[1][1] = 1;
temp.a[1][2] = 1;
temp.a[2][1] = 1;
temp.a[2][2] = 0;
// count = t;
//count2 = temp;
while (n != 0){
if (n % 2 == 1){
count.a[1][1]=(temp.a[1][1]*t.a[1][1]%mod+temp.a[1][2]*t.a[2][1]%mod)%mod;
// printf("%lld\t",count.a[1][1]);
count.a[1][2]=(temp.a[1][1]*t.a[1][2]%mod+temp.a[1][2]*t.a[2][2]%mod)%mod;
// printf("%lld\n",count.a[1][2]);
count.a[2][1]=(temp.a[2][1]*t.a[1][1]%mod+temp.a[2][2]*t.a[2][1]%mod)%mod;
// printf("%lld\t",count.a[2][1]);
count.a[2][2]=(temp.a[2][1]*t.a[1][2]%mod+temp.a[2][2]*t.a[2][2]%mod)%mod;
// printf("%lld\n",count.a[2][2]);
t = count;
}
//printf("%Temp :\n");
count2.a[1][1]=(temp.a[1][1]*temp.a[1][1]%mod+temp.a[1][2]*temp.a[2][1]%mod)%mod;
// printf("%lld\t",count2.a[1][1]);
count2.a[1][2]=(temp.a[1][1]*temp.a[1][2]%mod+temp.a[1][2]*temp.a[2][2]%mod)%mod;
// printf("%lld\n",count2.a[1][2]);
count2.a[2][1]=(temp.a[2][1]*temp.a[1][1]%mod+temp.a[2][2]*temp.a[2][1]%mod)%mod;
//printf("%lld\t",count2.a[2][1]);
count2.a[2][2]=(temp.a[2][1]*temp.a[1][2]%mod+temp.a[2][2]*temp.a[2][2]%mod)%mod;
//printf("%lld\n",count2.a[2][2]);
temp = count2;
n /= 2;
}
int i;
//printf("%lld\t%lld\n%lld\t%lld\n",t.a[1][1],t.a[1][2],t.a[2][1],t.a[2][2]);
long long re = (t.a[1][1]+t.a[1][2])%mod;
return re;
}
int main()
{
int t;
scanf("%d",&t);
while (t --){
long long n;
scanf("%lld",&n);
if (n == 1)printf("1\n");
else if(n == 2)printf("1\n");
else printf("%lld\n",fastMod(n-2,10007));
}
return 0;
}
这个矩阵的构造比较复杂,所以花费了一点时间。另外,矩阵的运算还有一个小问题。如果直接进行原来的快速幂时
不能自己等于自己乘自己,要先声明一个结构来把值储存起来。
下面就要进行矩阵的运算优化。
matrix multiply(matrix x,matrix y){
matrix temp;
memset(temp.a,0,sizeof(temp.a));
for(int i=0;i<3;i++)
for(int j=0;j<3;j++)
for(int k=0;k<3;k++)
temp.a[i][j]+=x.a[i][k]*y.a[k][j];
return temp;
}
这个就厉害了,不需要我那么臃肿的赋值。
提示结构体如果是同种类型的可以直接用“=”进行赋值。