c语言实现6乘6的的方阵,百炼2786-Pell数列-C语言-矩阵乘法-同余类

#include #define divisor 32767

/************************************************

和斐波那契数列一样,我们只需要将递推矩阵计算k-2次方即可

好吧,我们遇到了一个很尴尬的问题,就是在这个矩阵中a11的增长比

2的k-2次方还快一点,如果用置的数据类型,对于k>64的情况就没办法计算了

所以我们还要考虑这样一个问题:

a(n)=x*2+y

x=m*32767+a

y=n*32767+b

a(n)%32767=(2*a+b)%32767 所以为了防止矩阵越界,每次计算矩阵都只保留模32767的值

*************************************************/

int n,k;

struct matrix

{

long long a11,a12,a21,a22;

};

typedef struct matrix matrix;

long long sum;

matrix origin;

/***********************************************

**函数名:slove

**输入:n-需要将origin矩阵乘方的次数

**输出:origin n次方后的矩阵

**功能:计算origin的n次方

**作者:OrdinaryCrazy

**日期:20170804

**版本:1.0

************************************************/

matrix slove(int n)

{

if(n==1)

return origin;

matrix a,result;

if(n % 2)

{

a=slove(n - 1);

result.a11 = (a.a11 * origin.a11 + a.a12 * origin.a21) % divisor;

result.a12 = (a.a11 * origin.a12 + a.a12 * origin.a22) % divisor;

result.a21 = (a.a21 * origin.a11 + a.a22 * origin.a21) % divisor;

result.a22 = (a.a21 * origin.a12 + a.a22 * origin.a22) % divisor;

}

else

{

a=slove(n / 2);

result.a11 = (a.a11 * a.a11 + a.a12 * a.a21) % divisor;

result.a12 = (a.a11 * a.a12 + a.a12 * a.a22) % divisor;

result.a21 = (a.a21 * a.a11 + a.a22 * a.a21) % divisor;

result.a22 = (a.a21 * a.a12 + a.a22 * a.a22) % divisor;

}

return result;

}

int main()

{

origin.a11=2;

origin.a12=origin.a21=1;

origin.a22=0;

scanf("%d",&n);

while(n--)

{

scanf("%d",&k);

if(k>2)

{

matrix result;

result = slove(k - 2);

sum = 2*result.a11 + result.a12;

printf("%d\n",sum % 32767);

}

else

k==1 ? printf("1\n") : printf("2\n");

}

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值