题目:Fibonacci Check-up

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855

分析:

1)二项式展开:$(x+1)^n = \sum^n_{k=0}{C^k_n * x^k}$

2)Fibonacci数列可以写为:$ \left[ \begin{array}{cc} 0 & 1 \\ 1 & 1 \end{array} \right]^n$的左下角项。

3)构造矩阵$ T = Fib+E = \left[ \begin{array}{cc} 0 & 1 \\ 1 & 1 \end{array} \right] + \left[ \begin{array}{cc} 1 & 0 \\ 0 & 1 \end{array} \right] = \left[ \begin{array}{cc} 1 & 1 \\ 1 & 2 \end{array} \right]$。

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
int MOD;
struct Matrix{
LL a[][];
void init(int f){
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<;++i)a[i][i]=;
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(-);
for(int i=;i<;++i)
for(int j=;j<;++j)
for(int k=;k<;++k){
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j]%=MOD;
}
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init();
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n,Case;scanf("%d",&Case);
Matrix A,T;
T.a[][]=;T.a[][]=;
T.a[][]=;T.a[][]=; for(;Case--;){
scanf("%d%d",&n,&MOD);
A=T^n;
LL ans=A.a[][];
printf("%lld\n",ans%MOD);
} return ;
}

4)$\sum^n_{k=0}{C^k_n * f(k)} = f(2*n) $

5)证明:$ \sum^n_{k=0}{C^k_n * f(k)} $

= $ \sum^n_{k=0}{ C^k_n * { [ { ( \frac{1+\sqrt{5}}{2} )}^k - { ( \frac{1-\sqrt{5}}{2} )}^k }] } $

= $ \sum^n_{k=0}{ C^k_n * {( \frac{1+\sqrt{5}}{2} )}^k } - \sum^n_{k=0}{ C^k_n * { ( \frac{1-\sqrt{5}}{2} )}^k } $

= $ { ( \frac{1+\sqrt{5}}{2} + 1 ) }^k $ - $ { ( \frac{1-\sqrt{5}}{2} + 1 ) }^k $

= $ { ( \frac{3+\sqrt{5}}{2} ) }^k $ - $ { ( \frac{3-\sqrt{5}}{2} ) }^k $

= $ { ( \frac{6+2*\sqrt{5}}{4} ) }^k $ - $ { ( \frac{6-2*\sqrt{5}}{4} ) }^k $

= $ { ( \frac{1+\sqrt{5}}{2} ) }^{2k} $ - $ { ( \frac{1-\sqrt{5}}{2} ) }^{2k} $

= $ f(2*k) $

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
int MOD;
struct Matrix{
LL a[][];
void init(int f){
memset(a,,sizeof a);
if(f==-)return;
for(int i=;i<;++i)a[i][i]=;
}
};
Matrix operator*(Matrix& A,Matrix& B){
Matrix C;C.init(-);
for(int i=;i<;++i)
for(int j=;j<;++j)
for(int k=;k<;++k){
C.a[i][j]+=A.a[i][k]*B.a[k][j];
C.a[i][j]%=MOD;
}
return C;
}
Matrix operator^(Matrix A,int n){
Matrix Rt;Rt.init();
for(;n;n>>=){
if(n&)Rt=Rt*A;
A=A*A;
}
return Rt;
}
int main(){
int n,Case;scanf("%d",&Case);
Matrix A,T;
T.a[][]=;T.a[][]=;
T.a[][]=;T.a[][]=;
for(;Case--;){
scanf("%d%d",&n,&MOD);
A=T^(n+n);
LL ans=A.a[][];
printf("%lld\n",ans%MOD);
} return ;
}

最新文章

  1. VC 鼠标滚轮事件控制绘图的问题
  2. 15个nosql数据库
  3. Ajax基本知识
  4. 2014总结&amp;2015计划
  5. python compile
  6. js基础一
  7. 【转】MFC中调试过程中查看输出信息 -- 不错
  8. ALS数学点滴
  9. SQL Server 查看数据表占用空间大小的SQL语句
  10. layui_表格数据查询按钮
  11. Xml &amp; Tomcat
  12. linux启动httpd服务出现 Could not reliably determine the server`s fully qualified domain name.
  13. 讲道理,为什么分布式一定要有Redis?
  14. vm tools安装linux ubuntu和主机不能复制
  15. python多线程,多进程编程。
  16. git 学习汇总
  17. elastic search 概念
  18. PAT甲1004 Counting Leaves【dfs】
  19. 20145230熊佳炜《网络对抗》实验五:MSF基础应用
  20. 数组Byte [] 和 string 相互转换

热门文章

  1. 从零开始创建 symfony-cmf
  2. Vagrant 手册之 Vagrantfile - Vagrant 设置 config.vagrant
  3. upc组队赛17 Bits Reverse【暴力枚举】
  4. 【python】 全角半角转换
  5. Java IO(3)
  6. typedef&amp;define的用法与区别
  7. telnet访问出现telnet:Unable to connect to remote host: No route to host
  8. Node总结
  9. eclipsePreferences位置
  10. 69.Daily Temperatures(日常气温)