百炼2786-Pell数列-C语言-矩阵乘法-同余类
来源:互联网 发布:淘宝按图片搜索 编辑:程序博客网 时间:2024/06/02 03:35
很不错的一道题,除了矩阵快乘以外,还有线性代数和代数结构的相关知识。
/**************************************************文件名:**Copyright (c) 2010-2020 OrdinaryCrazy**创建人:OrdinaryCrazy**日期:20170804**描述:百炼-2786参考答案**版本:1.0*************************************************/#include <stdio.h>#include <stdlib.h>#define divisor 32767/************************************************和斐波那契数列一样,我们只需要将递推矩阵计算k-2次方即可好吧,我们遇到了一个很尴尬的问题,就是在这个矩阵中a11的增长比2的k-2次方还快一点,如果用置的数据类型,对于k>64的情况就没办法计算了所以我们还要考虑这样一个问题:a(n)=x*2+yx=m*32767+ay=n*32767+ba(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;}
阅读全文
0 0
- 百炼2786-Pell数列-C语言-矩阵乘法-同余类
- OpenJudge百炼-2793-孙子问题-C语言-大衍求一术解一般同余方程组
- 百练 2786 Pell数列
- poj 2786:Pell数列
- OpenJudge 2786 Pell数列
- C语言矩阵乘法
- 矩阵乘法C语言实现
- C语言实现矩阵乘法
- C语言实现矩阵乘法
- C语言 · 矩阵乘法
- 矩阵乘法(C语言)
- pell数列
- Pell数列
- Pell数列
- pell数列
- Pell数列
- Pell数列
- OpenJudge百炼-2980-大整数乘法-C语言-高精度计算
- POJ 2154 Color(polya+欧几里得)
- C# 中的数组和字典问题
- POJ 2955 Brackets(区间DP)
- HDU 2017 多校联合训练赛3 3003 6058 Kanade's sum 枚举 模拟链表
- HDU5514 Frogs(GCD+欧拉函数+数论)
- 百炼2786-Pell数列-C语言-矩阵乘法-同余类
- JSON工具类
- iOS 图文并茂的带你了解深拷贝与浅拷贝
- zhihu-spider之Feign——zhihu-spider开源项目使用技术详解(其六)
- 机器学习(统计学习方法)7 【感知机学习算法】
- 递归(Recursion)的两种优化方法
- 电脑系统配置设置
- 跨域资源共享终极手段:服务器代理转发
- [算法与数据结构]