hdu5950

题意

\(给出 f_1 , f_2 ,以及递推式 f_n = 2 * f_{n-2} + f_{n-1} + n^4 ,求 f_n (mod=2147493647)\)

推导一下。

\[\begin{Bmatrix}
f_n\\
f_{n-1}\\
f_{n-2}\\
(n+1)^4\\
(n+1)^3\\
(n+1)^2\\
(n+1)\\
1
\end{Bmatrix} =
\begin{Bmatrix}
1 & 2 & 0 & 1 & 0 & 0 & 0 & 0\\
1 & 0 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 1 & 0 & 0 & 0 & 0 & 0 & 0\\
0 & 0 & 0 & 1 & 4 & 6 & 4 & 1\\
0 & 0 & 0 & 0 & 1 & 3 & 3 & 1\\
0 & 0 & 0 & 0 & 0 & 1 & 2 & 1\\
0 & 0 & 0 & 0 & 0 & 0 & 1 & 1\\
0 & 0 & 0 & 0 & 0 & 0 & 0 & 1
\end{Bmatrix} *
\begin{Bmatrix}
f_{n-1}\\
f_{n-2}\\
f_{n-3}\\
n^4\\
n^3\\
n^2\\
n\\
1
\end{Bmatrix}\]

矩阵快速幂即可。

code

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std; const ll MOD = 2147493647;
const int SIZE = 11;
ll n;
//定义结构体
struct Matrix
{
ll mat[SIZE][SIZE];
Matrix()
{
memset(mat, 0, sizeof mat);
}
};
//矩阵乘法 重载 * 操作符
Matrix operator * (Matrix a, Matrix b)
{
Matrix c;
memset(c.mat, 0, sizeof(c.mat));
for(int i = 0; i < SIZE; i++)
{
for(int j = 0; j < SIZE; j++)
{
for(int k = 0; k < SIZE; k++)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD;
}
}
return c;
}
//矩阵快速幂 重载 ^ 操作符
Matrix operator ^ (Matrix a, ll k)
{
Matrix t;
memset(t.mat, 0, sizeof(t.mat));
for(int i = 0; i < SIZE; i++) // 单位矩阵
t.mat[i][i] = 1;
while(k)
{
if(k & 1)
t = t * a;
a = a * a;
k >>= 1;
}
return t;
} int main()
{
int t;
scanf("%d", &t);
while(t--)
{
Matrix mt;
ll a, b;
scanf("%lld%lld%lld", &n, &a, &b);
ll c = 2 * a + b + 81;
c %= MOD;
if(n == 1) printf("%lld\n", a % MOD);
else if(n == 2) printf("%lld\n", b % MOD);
else if(n == 3) printf("%lld\n", c % MOD);
else
{
mt.mat[0][0] = 1;
mt.mat[0][1] = 2;
mt.mat[0][3] = 1;
mt.mat[1][0] = 1;
mt.mat[2][1] = 1;
mt.mat[3][3] = 1;
mt.mat[3][4] = 4;
mt.mat[3][5] = 6;
mt.mat[3][6] = 4;
mt.mat[3][7] = 1;
mt.mat[4][4] = 1;
mt.mat[4][5] = 3;
mt.mat[4][6] = 3;
mt.mat[4][7] = 1;
mt.mat[5][5] = 1;
mt.mat[5][6] = 2;
mt.mat[5][7] = 1;
mt.mat[6][6] = 1;
mt.mat[6][7] = 1;
mt.mat[7][7] = 1;
mt = mt ^ (n - 3);
ll ans = mt.mat[0][0] * c + mt.mat[0][1] * b + mt.mat[0][2] * a + mt.mat[0][3] * 256
+ mt.mat[0][4] * 64 + mt.mat[0][5] * 16 + mt.mat[0][6] * 4 + mt.mat[0][7];
printf("%lld\n", ans % MOD);
}
}
return 0;
}

hdu5950的更多相关文章

  1. HDU5950 Recursive sequence —— 矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-5950 Recursive sequence Time Limit: 2000/1000 MS (Java/Others)   ...

  2. HDU5950(矩阵快速幂)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f(n) = f(n-1) + 2*f(n-2) + n^4,f(1) = a , f(2 ...

  3. 【HDU5950】Recursive sequence(矩阵快速幂)

    BUPT2017 wintertraining(15) #6F 题意 \(f(1)=a,f(2)=b,f(i)=2*(f(i-2)+f(i-1)+i^4)\) 给定n,a,b ,\(N,a,b < ...

  4. HDU5950 Recursive sequence (矩阵快速幂)

    Recursive sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...

  5. HDU5950 Recursive sequence (矩阵快速幂加速递推) (2016ACM/ICPC亚洲赛区沈阳站 Problem C)

    题目链接:传送门 题目: Recursive sequence Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total ...

  6. HDU5950 Recursive sequence 非线性递推式 矩阵快速幂

    题目传送门 题目描述:给出一个数列的第一项和第二项,计算第n项. 递推式是 f(n)=f(n-1)+2*f(n-2)+n^4. 由于n很大,所以肯定是矩阵快速幂的题目,但是矩阵快速幂只能解决线性的问题 ...

  7. HDU5950【矩阵快速幂】

    主要还是i^4化成一个(i+1)^4没遇到过,还是很基础的一题矩阵快速幂: #include <bits/stdc++.h> using namespace std; typedef lo ...

  8. HDU5950 矩阵快速幂(巧妙的递推)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5950 题意:f[n] = 2*f[n-2] + f[n-1] + n^4 思路:对于递推题而言,如果递 ...

  9. RecursiveSequence(HDU-5950)【矩阵快速幂】

    题目链接: 题意:Si=S(i-1)+2*S(i-2)+i^4,求Sn. 思路:想到了矩阵快速幂,实在没想出来怎么构造矩阵.... 首先构造一个向量vec={a,b,16,8,4,2,1}. 在构造求 ...

随机推荐

  1. USACO Section 1.1-3 Friday the Thirteenth

    Friday the Thirteenth 黑色星期五 13号又是一个星期五.13号在星期五比在其他日子少吗?为了回答这个问题,写一个程序,要求计算每个月的十三号落在周一到周日的次数. 给出N年的一个 ...

  2. 安装ruby compass失败

    安装compass失败 ERROR: Could not ), here is why: Unable to download data from https://rubygems.org/ - SS ...

  3. js解析器(重要!)

    JavaScript有"预解析"的特性,理解预解析是很重要的,不然在实际开发中可能会遇到很多无法解析的问题,甚至导致程序bug的存在. #js预解析执行过程: 预解析:(全局作用域 ...

  4. js闭包(closure),个人理解

    一.闭包概念理解 各种专业文献上对js"闭包"(closure)定义非常抽象,贼难看懂.我的理解是,闭包就是能够读取某函数内部变量的函数.由于在Javascript语言中只有在函数 ...

  5. 请为main函数提供返回值

    很多人甚至市面上的一些书籍,都使用了void main( ) ,其实这是错误的.C/C++ 中从来没有定义过void main( ).C++ 之父 Bjarne Stroustrup 在他的主页上的 ...

  6. Linux命令之初出茅庐

    此处讲解常用到的参数选项: ls 是列出文件的意思 ls -a ,查看所有文件包含隐藏文件 ls -l ,查看与文件相关的所有属性信息 ls -i ,查看文件的inode信息 ls -h,按照更为容易 ...

  7. WF4.0以上使用代码完整自定义动态生成执行工作流Xaml文件

    给大家分享一下,如何完全使用代码自定义的创建生成工作流文件(用代码创建Xaml文件),并且动态加载运行所生成的工作流. 工作流生成后 在Xaml文件里的主要节点如下: 输入输出参数 <x:Mem ...

  8. OC中常见的结构体,以及NSNumber、NSValue、NSDate的使用

    常见的结构体 NSPoint和CGPoint NSSize和CGSize NSRect 和 CGRect NSPoint和CGPoint的使用 NSPoint和CGPoint是同义的 typedef ...

  9. Java学习笔记——排序算法之简单排序

    男儿何不带吴钩,收取关山五十州.请君暂上凌烟阁,若个书生万户侯? --南园十三首 三种排序法: 1.冒泡法 2.简单选择法 3.直接插入法   上代码: 1.冒泡排序 public class Bub ...

  10. 随笔-关于公网IP无法访问服务器的解决办法

    笔者的环境: windows server 2008 r2 .IIS,php,MySql. 理论上来讲,服务器,其实就是一个大型计算机,我们通过访问服务器的某个端口请求某个资源. 正常情况下,如果没有 ...