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很大 这个问题和矩阵的特征值以 ...
随机推荐
- oracle 两个时间相减
oracle 两个时间相减默认的是天数 oracle 两个时间相减默认的是天数*24 为相差的小时数 oracle 两个时间相减默认的是天数*24*60 为相差的分钟数 oracle 两个时间相减默认 ...
- sizeof对int long double char的使用
主要针对int long char double 字节长度的识记. 1 #include <stdio.h> 2 3 int main() 4 { 5 int a[100]; 6 int ...
- chmod 命令——chmod 755与chmod 4755区别(转)
755和4755的区别 chmod是Linux下设置文件权限的命令,后面的数字表示不同用户或用户组的权限. 一般是三个数字:第一个数字表示文件所有者的权限第二个数字表示与文件所有者同属一个用户组的其他 ...
- java读取xml(当xml放在包里时)
- 【转】生产环境MySQL Server核心参数的配置
⑴ lower_case_table_names ● 推荐理由 GNU/Linux 平台,对数据库.表.存储过程等对象名称大小 ...
- Gnome快捷键
1.Gnome快捷键 http://wiki.ubuntu.org.cn/Gnome%E5%BF%AB%E6%8D%B7%E9%94%AE 2.
- 英文Ubuntu下Emacs 使用 ibus 五笔
Ubuntu 12.04 Precise 英文版本 1. 安装ibus/安装ibus-table-wubi http://wiki.ubuntu.org.cn/IBus 其中im-switch命令要在 ...
- ajax jquery return没有返回值
错误写法: function editdivisionmember(division_id,users_id){ $.ajax({ type:"POST", url:"/ ...
- 转:ReportViewer控件使用方法
a. ReportViewer关联Report1.rdlc的简单呈现b. 对带有报表参数的Report1.rdlc的呈现c. 利用程式生成的DataSet 填充报表d. 调用存储过程 生成DataSe ...
- 【转】arm交叉编译器gnueabi、none-eabi、arm-eabi、gnueabihf、gnueabi区别
原文网址:http://www.veryarm.com/296.html 命名规则 交叉编译工具链的命名规则为:arch [-vendor] [-os] [-(gnu)eabi] arch - 体系架 ...