HDU2855—Fibonacci Check-up
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855
题目意思:求一个式子g[n]=∑C(n,k)*f[k],n很大,很明显是一个矩阵快速幂。可以打表发现g[n]=f[2*n]划开可以发现g[n]=3*g[n-1]-f[n-2]。
思路:我们现在可以证明一下
f[2*n]=f[2*n-1]+f[2*n-2];
其中f[2*n-1]=f[2*n-2]+f[2*n-3]
f[2*n-2]=f[2*n-3]+f[2*n-4]
所以f[2*n]=f[2*n-2]+f[2*n-3]+f[2*n-3]+f[2*n-4]=2*f[2*n-2]+f[2*n-3]=2*f[2*n-2]+f[2*n-3]+f[2*n-4]-f[2*n-4]=3*f[2*n-2]-f[2*n-4]。我们化简一下g[n]=3*g[n-1]-g[n-2]。我们可以通过打表得到这个结论。
现在我们可以从数学上证明一下这个结论。
方法:1.通项公式:f[n]=(1/sqrt(5))*(((1+sqrt(5))/2)^n-((1-sqrt(5))/2)^n)
2.二项式:(1+a)^n=∑(C(n,k)*a^k)(0<=k<=n)
∑C(n,k)*f[k]=(1/sqrt(5))*∑C(n,k)*(((1+sqrt(5))/2)^k-((1-sqrt(5))/2)^k)
=(1/sqrt(5))*(∑C(n,k)*((1+sqrt(5))/2)^k-∑C(n,k)*((1-sqrt(5))/2)^k)
=(1/sqrt(5))*((3+sqrt(5))/2)^n-((3-sqrt(5))/2)^n)
=(1/sqrt(5))*((1+sqrt(5))/2)^(2*n)-((1-sqrt(5))/2)^(2*n))
=f[2*n]
这个组合数的应用感觉十分有意思。
代码:
//Author: xiaowuga
#include<bits/stdc++.h>
#define maxx INT_MAX
#define minn INT_MIN
#define inf 0x3f3f3f3f
#define N 2
using namespace std;
long long MOD;
typedef long long ll;
ll n,size=;//第n项,矩阵大小
struct Matrix{
ll mat[N][N];
void clear(){
memset(mat,,sizeof(mat));
}
Matrix operator * (const Matrix & m) const{
Matrix tmp;
int i ,j,k;
tmp.clear();
for( i=;i<size;i++)
for( k=;k<size;k++){
if(mat[i][k]==) continue;
for( j=;j<size;j++){
tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
tmp.mat[i][j]%=MOD;
}
}
return tmp;
}
};
Matrix POW(Matrix m,ll k){
Matrix ans;
memset(ans.mat,,sizeof(ans.mat));
for(int i=;i<size;i++) ans.mat[i][i]=;
while(k){
if(k&) ans=ans*m;
k/=;
m=m*m;
}
return ans;
}
int main() {
Matrix m;
m.clear();
m.mat[][]=;m.mat[][]=-;
m.mat[][]=;m.mat[][]=;
int T;
cin>>T;
for(int i=;i<T;i++){
cin>>n>>MOD;
if(n==) {cout<<<<endl;continue;}
Matrix ans=POW(m,n-);
ll sum=(ans.mat[][]%MOD+MOD)%MOD;
cout<<sum<<endl;
}
return ;
}
HDU2855—Fibonacci Check-up的更多相关文章
- [HDU2855]Fibonacci Check-up
		
题目:Fibonacci Check-up 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2855 分析: 1)二项式展开:$(x+1)^n = \sum^ ...
 - 可变长度的Fibonacci数列
		
原题目: Write a recursive program that extends the range of the Fibonacci sequence. The Fibonacci sequ ...
 - Applying Eigenvalues to the Fibonacci Problem
		
http://scottsievert.github.io/blog/2015/01/31/the-mysterious-eigenvalue/ The Fibonacci problem is a ...
 - hdu 5167 Fibonacci 打表
		
Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Proble ...
 - 【Fibonacci】BestCoder #28B Fibonacci
		
Fibonacci Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
 - hdu 5167 Fibonacci(预处理)
		
Problem Description Following is the recursive definition of Fibonacci sequence: Fi=⎧⎩⎨01Fi−1+Fi−2i ...
 - [Algorithm] Fibonacci Sequence - Anatomy of recursion and space complexity analysis
		
For Fibonacci Sequence, the space complexity should be the O(logN), which is the height of tree. Che ...
 - fibonacci数列的性质和实现方法
		
fibonacci数列的性质和实现方法 1.gcd(fib(n),fib(m))=fib(gcd(n,m)) 证明:可以通过反证法先证fibonacci数列的任意相邻两项一定互素,然后可证n>m ...
 - LeetCode 842. Split Array into Fibonacci Sequence
		
原题链接在这里:https://leetcode.com/problems/split-array-into-fibonacci-sequence/ 题目: Given a string S of d ...
 
随机推荐
- Spring Oauth2 with JWT Sample
			
https://www.javacodegeeks.com/2016/04/spring-oauth2-jwt-sample.html ******************************** ...
 - 解决Error: That port is already in use.
			
ubuntu系统下,运行一个django项目,即输入python manage.py runserver后,可能出现 Error: That port is already in use.的错误. 即 ...
 - sort-uniq-cut-join命令练习
			
[root@linux Desktop]# cat> fruits.txt banana orange persimmon %%banana apple ORAGE cat> fruits ...
 - CSS布局奇淫技巧之--各种居中<转>
			
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
 - modSecurity和Naxsi哪个更适合Nginx搭建WAF
			
nginx增加modsecurity模块 modsecurity原本是Apache上的一款开源waf,可以有效的增强web安全性,目前已经支持nginx和IIS,配合nginx的灵活和高效,可以打造成 ...
 - Entity Framework(三):使用特性(数据注解)创建表结构
			
一.理解Code First及其约定和配置 传统设计应用的方式都是由下而上的,即我们习惯优先考虑数据库,然后使用这个以数据为中心的方法在数据之上构建应用程序.这种方法非常适合于数据密集的应用或者数据库 ...
 - Android应用双击返回键退出
			
@Override public void onBackPressed() { // TODO 退出提示 if (System.currentTimeMillis() - mExitTime > ...
 - 抹掉Scala的糖衣(14) -- Update Method
			
欢迎关注我的新博客地址:http://cuipengfei.me/ 在Scala中,名字叫做update的方法是有特殊作用的. 比如: 1 2 3 val scores = new scala.col ...
 - 常用的easyui使用方法
			
-------datagrid 1.获取某行的行号(row)tdg.datagrid('getRowIndex',rows)2.通过行号移除该行tdg.datagrid('deleteRow',ind ...
 - 一种基于匹配回朔的 css3 选择器引擎实现
			
介绍 CSS 选择器是一种应用于 DOM 节点查找场景的特定微型语法, 本质上和正则表达式一样都是一种模式匹配语言,灵活使用可以方便得获取指定位置的节点集合. 目前 W3C 推荐标准为 Selecto ...