HDU 3306 - Another kind of Fibonacci
给你 A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2).
求 S(N) = A(0) 2 +A(1) 2+……+A(n) 2.
由于线性代数只能做线性变换,故要得出 A(n) 2 的递推式
A(n) 2 =X2A(N-1)2+Y2A(N-2)2+2XYA(N-1)A(N-2);
难点就在于 A(N-1)A(N-2) 这一项
故找到此项递推式
A(N-1)A(N-2) = (XA(N-2)+YA(N-3))*A(N-2) = XA(N-2)2+YA(N-2) A(N-3);
就可以写成矩阵
|1 X2 Y2 2XY| | S(n-1) | | S(n) |
|0 X2 Y2 2XY| * | A(n-1)2 | = | A(n)2 |
|0 0 1 0 | |A(n-2)2 | |A(n-1)2 |
|0 0 X Y | |A(n-2)A(n-3)| |A(n-1)A(n-2)|
剩下就是矩阵快速幂了
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
struct P{
int a[][];
}c,s,q;
int n,k,mod;
int a[][];
void ini()
{
memset(s.a,,sizeof(s.a));
for(int i=;i<=n;i++) s.a[i][i]=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
s.a[i][j+n]=s.a[i+n][j+n]=a[i][j];
memset(q.a,,sizeof(q.a));
for(int i=;i<=n;i++) q.a[i+n][i]=;
}
P mult(const P& a,const P& b)
{
P c;
for(int i=;i<=*n;++i)
{
for(int j=;j<=*n;++j)
{
c.a[i][j]=;
for(int k=;k<=*n;k++)
c.a[i][j]=(c.a[i][j]+a.a[i][k]*b.a[k][j] )%mod;
}
}
return c;
}
void fuc(int p)
{
memset(c.a,,sizeof(c.a));
for(int i=;i<=n*;i++) c.a[i][i]=;
while(p)
{
if(p&) c=mult(c,s);
s=mult(s,s);
p>>=;
}
}
int main()
{
while(~scanf("%d%d%d",&n,&k,&mod))
{
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
scanf("%d",&a[i][j]);
a[i][j]%mod;
}
}
ini();
fuc(k);
P ans;
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++)
{
ans.a[i][j]=;
for(int k=i;k<=*n;k++)
ans.a[i][j]=(ans.a[i][j]+c.a[i][k]*q.a[k][j] )%mod;
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=n;j++) printf("%d ",ans.a[i][j]);
puts("");
}
}
}
HDU 3306 - Another kind of Fibonacci的更多相关文章
- HDU 3306 Another kind of Fibonacci ---构造矩阵***
Another kind of Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Jav ...
- HDU 3306 Another kind of Fibonacci(矩阵+ll超时必须用int&输入必须取模&M必须是int类型)
Another kind of Fibonacci [题目链接]Another kind of Fibonacci [题目类型]矩阵+ll超时必须用int&输入必须取模&M必须是int ...
- hdu 3306 Another kind of Fibonacci(矩阵高速幂)
Another kind of Fibonacci Time Limit: 3000/10 ...
- HDU 3306 Another kind of Fibonacci(快速幂矩阵)
题目链接 构造矩阵 看的题解,剩下的就是模板了,好久没写过了,注意取余. #include <cstring> #include <cstdio> #include <s ...
- hdu 3306 Another kind of Fibonacci 矩阵快速幂
参考了某大佬的 我们可以根据(s[n-2], a[n-1]^2, a[n-1]*a[n-2], a[n-2]^2) * A = (s[n-1], a[n]^2, a[n]*a[n-1], a[n-1] ...
- hdu 1250 Hat's Fibonacci
pid=1250">点击此处就可以传送hdu 1250 Problem Description A Fibonacci sequence is calculated by adding ...
- HDU 1708 简单dp问题 Fibonacci String
Fibonacci String Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu acmsteps 2.2.1 Fibonacci
Fibonacci Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...
- HDU 5451 Best Solver(fibonacci)
感谢这道题让我复习了一遍线代,还学习了一些奇奇怪怪的数论. 令 二项展开以后根号部分抵消了 显然有 所以要求的答案是 如果n比较小的话,可以直接对二项式快速幂,但是这题n很大 这个问题和矩阵的特征值以 ...
随机推荐
- PHP学习笔记二十八【抽象类】
<?php //定义一个抽象类.主要用来被继承 //如果一个类继承了抽象类,则它必须实现该抽象类的所有抽象方法(除非它自己也是抽象类) // abstract class Animal{ pub ...
- iOS 关于tableView中有多个textField,输入框被遮住的解决方法
这里采用tableView整体上移的方法. 代码:(其中 60 为 单元格的高度) //点击输入框触发 - (void)textFieldDidBeginEditing:(UITextField *) ...
- TCP的流量控制(转载)
1.TCP的滑动窗口 为了提高信道的利用率TCP协议不使用停止等待协议,而是使用连续ARQ协议,意思就是可以连续发出若干个分组然后等待确认,而不是发送一个分组就停止并等待该分组的确认. TCP的两端都 ...
- OpenCV——KNN分类算法 <摘>
KNN近邻分类法(k-Nearest Neighbor)是一个理论上比较成熟的方法,也是最简单的机器学习算法之一. 这个算法首先贮藏所有的训练样本,然后通过分析(包括选举,计算加权和等方式)一个新样本 ...
- (转) 学习C++ -> 类(Classes)的定义与实现
学习C++ -> 类(Classes)的定义与实现 一."类" 的介绍 在C++中, 用 "类" 来描述 "对象", 所谓的&q ...
- php的json_encode函数问题
php的json_encode函数问题: $ary = []; $ary[0] = 'a'; $ary[1] = 'b'; echo json_encode($ary) . '<br>'; ...
- RESTful 架构
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...
- SHELL中的特殊变量和结构
SHELL中的特殊变量和结构 表格 B-1. 特殊的shell变量 变量 含义 $0 脚本名字 $1 位置参数 #1 $2 - $9 位置参数 #2 - #9 ${10} 位置参数 #10 $# 位置 ...
- Linux Ubuntu download
下载地址:http://www.ubuntu.com/download/ Ubuntu桌面用户版 符合用户个性的版本
- Implement Hash Map Using Primitive Types
A small coding test that I encountered today. Question Using only primitive types, implement a fixed ...