HDU 3306 Another kind of Fibonacci

题意:A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2) (N >= 2);给定三个值N,X,Y求S(N):S(N) = A(0)2 +A(1)2+……+A(n)2。

思路:原来我们讲的斐波那契数列是: F(0) = 1, F(1) = 1, F(N) = F(N - 1) + F(N - 2)

这道题规定了另一种斐波那契数列形式:A(0) = 1 , A(1) = 1 , A(N) = X * A(N - 1) + Y * A(N - 2)

其实原理是一样的!
我们以前快速求Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1第n项的方法是!!??!!
构造常系数矩阵!
(一)Fibonacci数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的第n项的快速求法(不考虑高精度).
解法:
考虑1×2的矩阵【f[n-2],f[n-1]】。根据fibonacci数列的递推关系,我们希望通过乘以一个2×2的矩阵,得到矩阵【f[n-1],f[n]】=【f[n-1],f[n-1]+f[n-2]】
很容易构造出这个2×2矩阵A,即:
0 1
1 1
所以,有【f[1],f[2]】×A=【f[2],f[3]】
又因为矩阵乘法满足结合律,故有:
【f[1],f[2]】×A n-1=【f[n],f[n+1]】
这个矩阵的第一个元素即为所求。
至于如何快速求出A n-1,相信大家都会,即递归地:n为偶数时,An=(A n/2)2;n为奇数时,An=(A n/2)2*A。
问题(一)解决。
(二)数列f[n]=f[n-1]+f[n-2]+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度).
解法:
仿照前例,考虑1×3的矩阵【f[n-2],f[n-1],1】,希望求得某3×3的矩阵A,使得此1×3的矩阵乘以A得到矩阵:【f[n-1],f[n],1】=【f[n-1],f[n-1]+f[n-2]+1,1】
容易构造出这个3×3的矩阵A,即:
0 1 0
1 1 0
0 1 1
问题(二)解决。
(三)数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的第n项的快速求法(不考虑高精度).
解法:
仿照前例,考虑1×4的矩阵【f[n-2],f[n-1],n,1】,希望求得某4×4的矩阵A,使得此1×4的矩阵乘以A得到矩阵:
【f[n-1],f[n],n+1,1】=【f[n-1],f[n-1]+f[n-2]+n+1,n+1,1】
容易构造出这个4×4的矩阵A,即:
0 1 0 0
1 1 0 0
0 1 1 0
0 1 1 1
问题(三)解决……
(四)数列f[n]=f[n-1]+f[n-2],f[1]=f[2]=1的前n项和s[n]的快速求法(不考虑高精度).
解法:
虽然我们有S[n]=F[n+2]-1,但本文不考虑此方法,我们想要得到更一般的方法。
考虑(一)的矩阵A,容易发现我们要求【f[1],f[2]】×(A+A2+A3+…+AN-1)。很多人使用一种很数学的方法构造一个2r*2r(r是A的阶数,这里为2)的矩阵来计算,这种方法比较麻烦且很慢,这里不再介绍。下面考虑一种新方法。
仿照之前的思路,考虑1×3的矩阵【f[n-2],f[n-1],s[n-2]】,我们希望通过乘以一个3×3的矩阵A,得到1×3的矩阵:
【f[n-1],f[n],s[n-1]】=【f[n-1],f[n-1]+f[n-2],s[n-2]+f[n-1]】
容易得到这个3×3的矩阵是:
0 1 0
1 1 1
0 0 1
然后…………容易发现,这种方法的矩阵规模是(r+1)*(r+1),比之前流行的方法好得多。
(五)数列f[n]=f[n-1]+f[n-2]+n+1,f[1]=f[2]=1的前n项和s[n]的快速求法(不考虑高精度).
解法:
结合(三)(四),容易想到……
考虑1×5的矩阵【f[n-2],f[n-1],s[n-2],n,1】,
我们需要找到一个5×5的矩阵A,使得它乘以A得到如下1×5的矩阵:
【f[n-1],f[n],s[n-1],n+1,1】
=【f[n-1], f[n-1]+f[n-2]+n+1,s[n-2]+f[n-1],n+1,1】
容易构造出A为:
0 1 0 0 0
1 1 1 0 0
0 0 1 0 0
0 1 0 1 0
0 1 0 1 1
然后……问题解决。
一般地,如果有f[n]=p*f[n-1]+q*f[n-2]+r*n+s
可以构造矩阵A为:
0 q 0 0 0
1 p 1 0 0
0 0 1 0 0
0 r 0 1 0
0 s 0 1 1
更一般的,对于f[n]=Sigma(a[n-i]*f[n-i])+Poly(n),其中0<i<=某常数c, Poly (n)表示n的多项式,我们依然可以构造类似的矩阵A来解决问题。
设Degree(Poly(n))=d, 并规定Poly(n)=0时,d=-1,此时对应于常系数线性齐次递推关系。则本方法求前n项和的复杂度为:
((c+1)+(d+1))3*logns

所以对于这道题,

我们可以根据(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]^2)

能够求出关系矩阵

      |  1  0  0  0    | 
A =    | 1 x^2 1  x   |
      | 0  y^2  0 0  |
         | 0  2*x*y 0 y |

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3306

 

View Code
 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cmath>
 4 #include <string>
 5 #include <algorithm>
 6 #include <iostream>
 7 using namespace std;
 8 const int N=5;
 9 const int mod=10007;
10 
11 typedef struct In{
12     __int64 m[N][N];
13 }Matrix;
14 Matrix init,unit,S;
15 __int64 n,x,y;
16 
17 void Init(){
18     for(int i=1;i<N;i++){
19         for(int j=1;j<N;j++){
20             if(i==1&&j==1) init.m[i][j]=1;
21             else if(i==2&&j==1) init.m[i][j]=1;
22             else if(i==2&&j==2) init.m[i][j]=x*x%mod;
23             else if(i==2&&j==3) init.m[i][j]=1;
24             else if(i==2&&j==4) init.m[i][j]=x%mod;
25             else if(i==3&&j==2)    init.m[i][j]=y*y%mod;
26             else if(i==4&&j==2) init.m[i][j]=2*x*y%mod;
27             else if(i==4&&j==4) init.m[i][j]=y%mod;
28             else init.m[i][j]=0;
29             unit.m[i][j]=(i==j);
30             if(i==1) S.m[i][j]=1;
31             else S.m[i][j]=0;
32         }
33     }
34 }
35 
36 Matrix Mul(Matrix a,Matrix b){
37     Matrix c;
38     for(int i=1;i<N;i++)
39         for(int j=1;j<N;j++){
40             c.m[i][j]=0;
41             for(int k=1;k<N;k++){
42                 c.m[i][j]+=a.m[i][k]*b.m[k][j];
43                 c.m[i][j]%=mod;
44             }
45         }
46     return c;
47 }
48 
49 Matrix Pow(Matrix a,Matrix b){
50     while(n){
51         if(n&1) b=Mul(a,b);
52         a=Mul(a,a);
53         n>>=1;
54     }
55     return b;
56 }
57 
58 void Debug(Matrix a){
59     for(int i=1;i<N;i++){
60         for(int j=1;j<N;j++)
61             printf("%d ",a.m[i][j]);
62         puts("");
63     }
64 }
65 
66 int main(){
67     
68 //    freopen("data.in","r",stdin);
69 //    freopen("data.out","w",stdout);
70     
71     while(scanf("%I64d%I64d%I64d",&n,&x,&y)!=EOF){
72         Init();
73         Matrix x=Pow(init,unit);
74         x=Mul(S,x);
75     //    Debug(x);
76         printf("%I64d\n",x.m[1][1]%mod);
77     }
78     return 0;
79 }

转载于:https://www.cnblogs.com/Hug-Sea/articles/2479752.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/434557.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php中拼接html代码,如何利用ajax给html动态拼接代码

function get_all_category_with_id() {$.ajax( {type: "get", url: "../../../appUpload/getAllCategoryByid", async : false, dataType: "text", success: function (data) {var obj JSON.parse(data);var str "";//先将元素对应清…

Arm Linux交叉编译和连接过程分析(1)

一、配置内核&#xff08;Kconfig&#xff09; 我们配置内核是实质是根据众多目录下面的Kconfig文件中组合成我们需要的一个最佳选择&#xff0c;即最终在根目录下面生成的.config文件&#xff0c;而这个文件会在根目录Makefile下调用的。这一部分我们主要讨论整个SEP4020体系…

struts2标签_select获取action传过来的值

<s:select list"#session.userlist" //从Action传过来的键(属性)的名称headerKey"请选择" //默认选中项的值headerValue"请选择" //默认选中项显示的信息listKey"project_id" …

3500 yuan to php,350 CNY to PHP Currency Converter - 人民币 菲律宾比索 汇率兑换

Exchange350 CNY2612.29 PHPExchange 350 人民币2612.29 菲律宾比索Exchange1750 CNY13061.46 PHPExchange 1750 人民币13061.46 菲律宾比索Exchange3500 CNY26122.92 PHPExchange 3500 人民币26122.92 菲律宾比索Exchange17500 CNY130614.62 PHPExchange 17500 人民币130614.6…

Arm Linux交叉编译和连接过程分析(2)

二、编译内核镜像过程 1、编译过程中涉及到到文件&#xff1a; /Makefile 编译产生顶层vmlinux镜像文件/scripts/Kbuild.include make过程中到一些基本定义 /scripts/Makefile.lib 编译内核时用到到函数库文件 /scripts/Makefile.build 内核编译到相关命令文件…

sipxecs简介

SipX和SipExchange的代码于2007年合并成SipXecs&#xff0c;北电和NTT等大公司参与构建SipXecs架构。SipXecs是电信级的&#xff0c;针对统一通信UC和呼叫中心Call Center应用&#xff0c;另外&#xff0c;支持设备批量升级&#xff0c;批量配置管理等应用&#xff0c;网管支持…

ASP.NET数据格式的Format-- DataFormatString

我们在呈现数据的时候&#xff0c;不要将未经修饰过的数据呈现给使用者。例如金额一万元&#xff0c;如果我们直接显示「10000」&#xff0c;可能会导致使用者看成一千或十万&#xff0c;造成使用者阅读数据上的困扰。若我们将一万元润饰后输出为「NT$10,000」&#xff0c;不但…

fortran转换 matlab代码,将Fortran77代码转换为Matlab代码以查找特征值/向量

我将Fortran 77中的书面代码转换为Matlab代码。该函数使用QL算法计算矩阵的特征值和特征向量。由于某些原因&#xff0c;我不能在matlab中使用eig函数的结果。这种方法得到的特征值与eig函数得到的特征值不一样&#xff0c;有些相同但有些不同。我不知道问题在哪里。感谢您的任…

linux内核中分配4M以上大内存的方法

在内核中, kmalloc能够分配的最大连续内存为2的(MAX_ORDER-1)次方个page(参见alloc_pages函数, "if (unlikely(order > MAX_ORDER)) return NULL;"), page的大小一般是4K bytes,MAX_ORDER缺省定义为11, 所以如果不修改内核, kmalloc能够分配的最大连续…

sql server 2008学习3 表组织和索引组织

表组织 表包含在一个或多个分区中&#xff0c;每个分区在一个堆或一个聚集索引结构包含数据行。堆页或聚集索引页在一个或多个分配单元中进行管理&#xff0c;具体的分配单元数取决于数据行中的列类型。 聚集表、堆和索引 SQL Server 表使用下列两种方法之一来组织其分区中的数…

BootLoader与Linux内核的参数传递

在嵌入式系统中&#xff0c;BootLoader 是用来初始化硬件&#xff0c;加载内核&#xff0c;传递参数。因为嵌入式系统的硬件环境各不相同&#xff0c;所以嵌入式系统的BootLoader 也各不相同&#xff0c;其中比较通用的是U-Boot&#xff0c;它支持不同的体系结构&#xff0c;如…

怎么跟踪php代码,第九节 PHP 跟踪调试代码 XDebug

>[success] # PHP 跟踪调试代码 XDebug- [下载XDebug扩展](https://xdebug.org/download.php)- 下载对应PHP版本的Xdebug![](https://box.kancloud.cn/c17f1f1e965522c2fe1411e1759e4447_870x524.png)- 线程安全(TS)和非线程安全(NTS)![](https://box.kancloud.cn/24efc18d4…

oracle经纬度换算成xy坐标,经纬度换算成xy坐标(经纬度转换xy坐标算法)

经纬度怎么转换成平面xy坐标&#xff1f;这里面的经纬度转换成xy坐标是多少&#xff1f;求解你把角度的单位设成度分秒制输入不久可以了。具体输入units命令&#xff0c;对话框中会有一个角度的单位制选择&#xff0c;包括度分秒制。例如绘制一条与当前点距离为100&#xff0c;…

Linux内核参数传递Tag

在2.4&#xff08;具体哪个版本记不清了&#xff09;以后的Linux内核中引入了一种新的向内核传递参数的方法tag标记。内核参数通过一个静态的tag链表在启动的时候传递到内核。每个tag的结构为 ----------- tag_header ----------- tag_xxx ----------- 其中tag_header为tag头&a…

ns学习资料

&#xff08;一&#xff09;. NS常用基本网站   1. Maillist个人觉得是寻求问题答案最好的地方。   http://mailman.isi.edu/pipermail/ns-users/   2. 柯老师的网站&#xff0c;包含很多非常实用资源&#xff1a;安装&#xff0c;trace文件分析&#xff0c;源代码分析&a…

Oracle备份standby,Oracle 11g 利用泠备份恢复standby库

Oracle 11g 利用泠备份恢复standby库1 开始在备库上进行泠备份先查好控制文件、redo、undo文件、数据文件的路径1.1 先关闭主库的归档日志传输SQL> ALTER system SETlog_archive_dest_state_2 DEFER;System altered.SQL>1.2 先关闭standby库SQL> shutdown immediate;D…

Linux内核参数的介绍

sysctl -a 可以列出当前所有的Linux内核参数。 /proc/sys/目录下的东西&#xff0c;对应着sysctl -a列出来的。 man 5 proc syscall 在 /arch/i386/kernel/entry.S里面列出来&#xff0c;这个看起来可能更方便

matlab单位阶跃响应与单位脉冲响应,python 已知响应函数求单位阶跃响应或脉冲响应...

最近学习自动控制原理&#xff0c;关于控制系统的一些&#xff0c;老师用布置了一些作业说要用matlab画&#xff0c;我试试python首先介绍一下所使用的库&#xff1a;control matplotlib sympy1.control库&#xff1a;用来计算脉冲响应与阶跃响应Paste_Image.png2.sympy&#x…

SQL SERVER 的SQL语句优化方式小结

SQL SERVER 的SQL语句优化方式小结详细出处参考&#xff1a;http://www.jb51.net/article/19547.htm 1、SQL SERVER 2005的性能工具中有SQL Server Profiler和数据库引擎优化顾问&#xff0c;极好的东东&#xff0c;必须熟练使用。 2、查询SQL语句时打开“显示估计的执行计划”…

u-boot向linux内核传递启动参数

U-BOOT 在启动内核时,会向内核传递一些参数.而这些参数是通过 structtag来传递的。 U-boot 把要传递给 kernel 的东西保存在 struct tag数据结构中&#xff0c;启动 kernel 时&#xff0c;把这个结构体的物理地址传给 kernel&#xff1b;Linux kernel通过这个地址分析出u-boot传…