【HDOJ5950】Recursive sequence(矩阵乘法,快速幂)
题意:f[1]=a,f[2]=b,f[i]=2f[i-2]+f[i-1]+i^4(i>=3),多组询问求f[n]对2147493647取模
N,a,b < 2^31
思路:重点在于i^4的处理
对于i转移矩阵中可以记录下它的0,1,2,3,4次项
i的幂又可以由i-1的幂运算得出,最后推出的系数是二项式展开的系数
试试新的矩乘模板
- #include<cstdio>
- #include<cstring>
- #include<string>
- #include<cmath>
- #include<iostream>
- #include<algorithm>
- #include<map>
- #include<set>
- #include<queue>
- #include<vector>
- using namespace std;
- typedef long long ll;
- typedef unsigned int uint;
- typedef unsigned long long ull;
- typedef pair<int,int> PII;
- typedef vector<int> VI;
- #define fi first
- #define se second
- #define MP make_pair
- #define N 2100000
- #define MOD 2147493647
- #define eps 1e-8
- #define pi acos(-1)
- const int MAXN=;
- int read()
- {
- int v=,f=;
- char c=getchar();
- while(c<||<c) {if(c=='-') f=-; c=getchar();}
- while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
- return v*f;
- }
- struct matrix //矩阵类
- {
- int n,m;
- ll data[MAXN][MAXN];
- };
- matrix ma,mb;
- ll a,b,c,d,p,n;
- matrix matrixMul(matrix a, matrix b)
- {
- matrix re;
- if(a.m!=b.n)
- {
- printf("error\n");
- return re;
- }
- memset(re.data,,sizeof(re.data));
- re.n = a.n; re.m = b.m;
- for(int i = ; i <= a.n; i++)
- {
- for(int j = ; j <= a.m; j++)
- {
- if(a.data[i][j] == ) continue;
- for(int k = ; k <= b.m; k++)
- {
- re.data[i][k] += (a.data[i][j] % MOD * b.data[j][k] % MOD) % MOD;
- re.data[i][k] %= MOD;
- }
- }
- }
- return re;
- }
- matrix matrixPow(matrix a,int b)
- {
- matrix re;
- if(a.n!=a.m)
- {
- printf("error2\n");
- return re;
- }
- re.n=re.m=a.n;
- memset(re.data,,sizeof(re.data));
- for(int i=;i<=re.n;i++) re.data[i][i]=;
- while(b)
- {
- if(b&) re=matrixMul(re,a);
- a=matrixMul(a,a);
- b>>=;
- }
- return re;
- }
- void inputMat(int n,int m,matrix &a,ll *b)
- {
- a.n = n; a.m = m;
- for(int i = ; i <= n; i++)
- for(int j = ; j <= m; j++)
- a.data[i][j] = *(b + (i - ) * m + (j - ));
- }
- void init(){
- ll pt[][] = {b,a,,,,,};
- inputMat(,,ma,*pt);
- ll pt2[][] = {,,,,,,,
- ,,,,,,,
- ,,,,,,,
- ,,,,,,,
- ,,,,,,,
- ,,,,,,,
- ,,,,,,,};
- inputMat(,,mb,*pt2);
- }
- int main()
- {
- int cas;
- scanf("%d",&cas);
- while(cas--)
- {
- scanf("%I64d%I64d%I64d",&n,&a,&b);
- int i=;
- a%=MOD;
- b%=MOD;
- if(n == )
- printf("%I64d\n",a);
- else if(n == )
- printf("%I64d\n",b);
- else
- {
- init();
- ma=matrixMul(ma,matrixPow(mb,n-));
- }
- printf("%I64d\n",ma.data[][]);
- }
- return ;
- }
【HDOJ5950】Recursive sequence(矩阵乘法,快速幂)的更多相关文章
- Qbxt 模拟赛 Day4 T2 gcd(矩阵乘法快速幂)
/* 矩阵乘法+快速幂. 一开始迷之题意.. 这个gcd有个规律. a b b c=a*x+b(x为常数). 然后要使b+c最小的话. 那x就等于1咯. 那么问题转化为求 a b b a+b 就是斐波 ...
- 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解
矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...
- ACM学习历程—HDU5667 Sequence(数论 && 矩阵乘法 && 快速幂)
http://acm.hdu.edu.cn/showproblem.php?pid=5667 这题的关键是处理指数,因为最后结果是a^t这种的,主要是如何计算t. 发现t是一个递推式,t(n) = c ...
- 矩阵乘法快速幂 codevs 1732 Fibonacci数列 2
1732 Fibonacci数列 2 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 在“ ...
- codevs1281 矩阵乘法 快速幂 !!!手写乘法取模!!! 练习struct的构造函数和成员函数
对于这道题目以及我的快速幂以及我的一节半晚自习我表示无力吐槽,, 首先矩阵乘法和快速幂没必要太多说吧,,嗯没必要,,我相信没必要,,实在做不出来写两个矩阵手推一下也就能理解矩阵的顺序了,要格外注意一些 ...
- [vijos1725&bzoj2875]随机数生成器<矩阵乘法&快速幂&快速乘>
题目链接:https://vijos.org/p/1725 http://www.lydsy.com/JudgeOnline/problem.php?id=2875 这题是前几年的noi的题,时间比较 ...
- [codevs]1250斐波那契数列<矩阵乘法&快速幂>
题目描述 Description 定义:f0=f1=1, fn=fn-1+fn-2(n>=2).{fi}称为Fibonacci数列. 输入n,求fn mod q.其中1<=q<=30 ...
- 【BZOJ-1009】GT考试 KMP+DP+矩阵乘法+快速幂
1009: [HNOI2008]GT考试 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 2745 Solved: 1694[Submit][Statu ...
- 矩阵乘法快速幂 codevs 1574 广义斐波那契数列
codevs 1574 广义斐波那契数列 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 广义的斐波那契数列是指形如 ...
- BZOJ-1875 HH去散步 DP+矩阵乘法快速幂
1875: [SDOI2009]HH去散步 Time Limit: 20 Sec Memory Limit: 64 MB Submit: 1196 Solved: 553 [Submit][Statu ...
随机推荐
- GNU make(2)
GNU make(2) 参考: GNU Make学习总结(二) 变量 变量由一个前导符号$加上字符或者是括号字符组成, 名称区分大小写. 命名: 习惯上用全部大写字符表示常量, 小写字符表示变量, 单 ...
- 动态规划初步--最长上升子序列(LIS)
一.问题 有一个长为n的数列 a0,a1,a2...,an-1a.请求出这个序列中最长的上升子序列的长度和对应的子序列.上升子序列指的是对任意的i < j都满足ai < aj的子序列. 二 ...
- CPP-基础:windows api 多线程---互斥量、信号量、临界值、事件区别
http://blog.csdn.net/wangsifu2009/article/details/6728155 四种进程或线程同步互斥的控制方法:1.临界区:通过对多线程的串行化来访问公共资源或一 ...
- linux虚拟机安装值得注意的几点
1.建立新的虚拟机时选择自定义安装并选择稍后安装操作系统 2.关键安装命令 tar -xzvf VMwareTools-10.0.6-3595377.tar.gz sudo ./wmware-ins ...
- clover如何使用UEFI引导和EFI驱动选择
EFI分区实际上是一个FAT格式的分区,不一定要是第一个分区,GPT磁盘下任何一个FAT文件格式的分区都可以用来放EFI引导文件.主板UEFI先默认引导你所设置的第一优先启动分区下的\EFI\boot ...
- (23)zabbix单位符号Unit symbols
概述 在zabbix里面,我们不需要使用大数字来,例如我们可以不使用86400来表示一天,这个数字又不容易理解也容易出错.用什么办法来解决大数字问题呢?我们可以使用单位来简化,例如简化zabbix触发 ...
- 解决zend studio代码无法自动提示的3个方法
最近电脑重装,索性把用了好多年的老版本7.x 升级了,网上下载了一个12.x的破解版. 起初一切正常,等导入项目开始开发的时候发现PHP函数尽然没有提示,一脸懵逼! 经过多方查阅和尝试,现在分享3个解 ...
- python 有4个数字1234,能组成多少个互不相同且无重复的三位数数字。
def output(): count = 0 for i in range(1,5): for j in range(1, 5): for k in range(1, 5): if i==j or ...
- Python日志(logging)模块,shelve,sys模块
菜鸟学python第十七天 1.logging 模块 logging模块即日志记录模块 用途:用来记录日志 为什么要记录日志: 为了日后复查,提取有用信息 如何记录文件 直接打开文件,往里写东西 直接 ...
- GYM 101350 G
G. Snake Rana time limit per test 4.0 s memory limit per test 256 MB input standard input output sta ...