HDU3306-Another kind of Fibonacci(矩阵构造)
Another kind of Fibonacci
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1272 Accepted Submission(s): 490
3 2 3
196
虽然以前接触过矩阵,但是拿到这题后还是无从下手,后来上网看了好多有关矩阵的东西,总算明白如何用矩阵来求解问题了,这道题算是自己的一个矩阵入门吧。
这题与Fibonacci求f(n)很像,但是这题求得是前n项的平方和,已知,A(n)=x*A(n-1)+y*A(n-2)--(1),S(n)=A(0)^2+A(1)^2+……+A(n)^2=S(n-1)+A(n)^2--(2)
将(1)式带入(2)得,S(n)=S(n-1)+x*x*A(n-1)^2+y*y*A(n-2)^2+2*x*y*A(n-1)*A(n-2)--(3),根据(3)式可得矩阵B={S(n-1),A(n-1)^2,A(n-2)^2,A(n-1)*A(n-2)},
现在需要一个四阶矩阵A,使得B乘以A后得到{S(n),A(n)^2,A(n-1)^2,A(n)*A(n-1)},接下来就是构造这个函数A,不难得出
|1 0 0 0|
|x*x x*x 1 x|
A= |y*y y*y 0 0|
|2xy 2xy 0 y|
最后{S(1) , A(1)^2 , A(0)^2 , A(1)*A(2)}*A^(n-1)={S(n) , A(n)^2 , A(n-1)^2 , A(n)*A(n-1)},该矩阵第一个元素即为所求答案。其中A^(n-1)用快速幂求解。
#include<stdio.h>
#include<string.h>
void fac1(__int64 a[4][4],__int64 b[4][4])
{
__int64 i,j,k,c[4][4];
memset(c,0,sizeof(c));
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
for(k=0;k<4;k++)
{
c[i][j]+=(a[i][k]*b[k][j])%10007;
}
}
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=c[i][j]%10007;
}
void fac2(__int64 a[4][4],__int64 b[4])
{
__int64 i,j,c[4];
memset(c,0,sizeof(c));
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
c[i]+=(b[j]*a[j][i])%10007;
}
for(i=0;i<4;i++)
b[i]=c[i]%10007;
}
void pow(__int64 a[4][4],__int64 n)
{
__int64 i,j,ans[4][4];
memset(ans,0,sizeof(ans));
for(i=0;i<4;i++)
ans[i][i]=1;
while(n>=1)
{
if(n%2)fac1(ans,a);
n/=2;
fac1(a,a);
}
for(i=0;i<4;i++)
for(j=0;j<4;j++)
a[i][j]=ans[i][j]%10007;
}
int main()
{
__int64 n,x,y;
while(scanf("%I64d%I64d%I64d",&n,&x,&y)!=EOF)
{
__int64 a[4][4],b[4];
a[0][0]=a[1][2]=1;
a[0][1]=a[0][2]=a[0][3]=a[2][2]=a[2][3]=a[3][2]=0;
a[1][0]=a[1][1]=(x*x)%10007;
a[1][3]=x%10007;
a[2][0]=a[2][1]=(y*y)%10007;
a[3][0]=a[3][1]=(2*x*y)%10007;
a[3][3]=y%10007;
b[0]=2;b[1]=1;b[2]=1;b[3]=1;
pow(a,n-1);
fac2(a,b);
printf("%I64d\n",b[0]%10007);
}
return 0;
}
HDU3306-Another kind of Fibonacci(矩阵构造)的更多相关文章
- HDU3306 Another kind of Fibonacci 矩阵
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - HDU3306 题意概括 A0=1,A1=1,AN=X*AN-1+Y*AN-2(N>=2).求SN,SN ...
- BZOJ3286 Fibonacci矩阵 矩阵 快速幂 卡常
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ3286 题意概括 n,m,a,b,c,d,e,f<=10^1000000 题解 神奇的卡常题目 ...
- hdu 1588(Fibonacci矩阵求和)
题目的大意就是求等差数列对应的Fibonacci数值的和,容易知道Fibonacci对应的矩阵为[1,1,1,0],因为题目中f[0]=0,f[1]=1,所以推出最后结果f[n]=(A^n-1).a, ...
- hdu3306 Another kind of Fibonacci【矩阵快速幂】
转载请注明出处:http://www.cnblogs.com/KirisameMarisa/p/4187670.html 题目链接:http://acm.hdu.edu.cn/showproblem. ...
- POJ3070 Fibonacci[矩阵乘法]
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- POJ3070 Fibonacci[矩阵乘法]【学习笔记】
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13677 Accepted: 9697 Descri ...
- HDU 1588 Gauss Fibonacci(矩阵快速幂)
Gauss Fibonacci Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 【全国互虐】Fibonacci矩阵
orz啊又被屠了 人生如此艰难 题意: 给定一个k维的n^k的超立方体 超立方体的元素Ai1,i2,...,ik 的值为f(i1+i2+...+ik-k+1) f为斐波那契数列 求该超立方体的所有元素 ...
- POJ 3070 Fibonacci(矩阵高速功率)
职务地址:POJ 3070 用这个题学会了用矩阵高速幂来高速求斐波那契数. 依据上个公式可知,第1行第2列和第2行第1列的数都是第n个斐波那契数.所以构造矩阵.求高速幂就可以. 代码例如以下: #in ...
随机推荐
- 《iOS开发实战 从入门到上架App Store(第2版)》书籍目录
第1章 开发准备 1.1 iOS 10新特性简述 1.1.1 新增触觉反馈编程接口 1.1.2 SiriKit框架的开放 1.1.3 引入Messages App 1.1.4 通知框架的整合与扩展 1 ...
- Vue学习笔记:v-bind 属性动态绑定
v-bind 的作用 v-bind指令可以将节点的属性与动态表达式绑定在一起 v-bind可以绑定html元素中的各种属性 例如: <a v-bind:href="xxx"& ...
- CentOS7.3下载地址
CentOS 7.3,是CentOS-7系列的第四个发行版本,官方版本号为7.3.1611.该版本的安装映像只有 64 位,具体的安装映像有以下几种: DVD版 推荐(迅雷下载):http://arc ...
- 吴裕雄--天生自然TensorFlow2教程:输出方式
sigmoid out' = sigmoid(out) # 把输出值压缩在0-1 import tensorflow as tf a = tf.linspace(-6., 6, 10) a tf.si ...
- c++继承:公有、私有、保护(对应p12访问限制)
公有继承(public).私有继承(private).保护继承(protected)是常用的三种继承方式. 1. 公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时, ...
- day19-Python运维开发基础(类的魔术方法)
1. __new__魔术方法 # ### __new__ 魔术方法 ''' 触发时机:实例化类生成对象的时候触发(触发时机在__init__之前) 功能:控制对象的创建过程 参数:至少一个cls接受当 ...
- 127、Java面向对象之对象的比较
01.代码如下: package TIANPAN; class Book { private String title; private double price; public Book(Strin ...
- 中山Day5——普及
今天题目真是贼难呐...才38... 收获:树状数组单个修改 树状数组区间修改 T1:旅行 题意:有n个数,问;从中取任意个数,他们的和为质数的方案数是多少?(n<=50) 暴力模拟即可,这里不 ...
- 观察者设计模式(C#委托和事件的使用)
观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知并自动刷新.在现实生活中的可见观察者模式,例如,微信中的订阅号,订阅博客和QQ微博中关注好友 ...
- Swift-如何快速学习Swift
关于本文: 1.说明本文写作的目的 2.整理了Swift的基本语法树 3.看图作文 一.写作目的 昨天看了一个知识专栏,作者讲述的是“如何研究性的学习”.整个课程1个小时9分钟,花了我19块人民币.其 ...