数论 快速矩阵幂 POJ 3070 Fibonacci
来源:互联网 发布:手机和mac照片同步 编辑:程序博客网 时间:2024/05/17 07:05
题意:
输入k,求斐波那契数列的第k个数 mod 10000 f(n)=f(n-1)+f(n-2)
斐波那契数列 0,1,1,2,3,5,8.....n
题解:
关键点1:
d [ 1 1 ] * e [ A ] = e [ A+B ]
[ 1 0 ] [ B ] [ A ]
关键点2:
2^11 = (2^4)(2^2)(2^1) 这样可以加快计算 幂 原本要循环11次,现在只用3次
关键点3:
二进制 >>: 右移一位 || &1 :个位是否为1
根据d矩阵的特性 和 e单位矩阵 结合
d [ 1 1 ] e [ 1 0 ]
[ 1 0 ] [ 0 1 ]
e=d * e'
d= d * d ;
#include <cstdio>#include <cstring>#include <iostream>using namespace std;const int mod=10000;const int N=2;struct mat{//矩阵 int n,at[N][N];mat(int n=0){this->n=n;memset(at,0,sizeof(at));}mat operator *(mat b){mat tmp=mat(n);for(int i=0;i<N;i++){for(int k=0;k<N;k++){if(at[i][k]){for(int j=0;j<N;j++){tmp.at[i][j]=(tmp.at[i][j]+(at[i][k] * b.at[k][j])%mod)%mod;}}}}return tmp;}};mat sol(mat d,int k){//k=1 if(k==1) return d;mat e;//单位矩阵 memset(e.at,0,sizeof(e.at));for(int i=0;i<N;i++)e.at[i][i]=1;if(k==0) return e;while(k){if(k&1) e=d*e;d=d*d;k>>=1;//先右移一位,再赋值给k }return e;}int main(){mat d;//初始化 {{1,1},{1,0}}矩阵 d.at[0][0]=1;d.at[0][1]=1;d.at[1][0]=1;d.at[1][1]=0;int k;while(~scanf("%d%",&k) && k!=-1){mat ret=sol(d,k);int ans=ret.at[0][1]%mod;printf("%d\n",ans);}return 0;}
0 0
- 数论 快速矩阵幂 POJ 3070 Fibonacci
- POJ 3070 Fibonacci【矩阵快速幂】【感受数论的神奇】
- POJ 3070 Fibonacci 矩阵快速幂
- poj - 3070 - Fibonacci(矩阵快速幂)
- 矩阵快速幂 Fibonacci 3070 poj
- POJ 3070 Fibonacci (矩阵快速幂)
- poj 3070 Fibonacci (矩阵快速幂)
- poj 3070 Fibonacci(矩阵快速幂)
- poj 3070 Fibonacci 矩阵快速幂
- POJ 3070 Fibonacci(矩阵快速幂)
- poj 3070 Fibonacci(矩阵快速幂)
- POJ-3070 Fibonacci 矩阵快速幂
- Fibonacci - POJ 3070 矩阵乘法快速幂
- poj 3070 Fibonacci(矩阵快速幂)
- poj 3070 Fibonacci 矩阵快速幂
- POJ 3070 Fibonacci(矩阵快速幂)
- POJ 3070 Fibonacci(矩阵快速幂)
- poj 3070 Fibonacci 矩阵快速幂
- Maven 构建多模块(8)
- 腾讯校招模拟面试题之蛇形打印
- hdu1875——畅通工程再续(最小生成树)
- 关于点9图的制作(每天积累一点点)
- 【数论】hdu5080 Colorful Toy (polya计数+简单几何)
- 数论 快速矩阵幂 POJ 3070 Fibonacci
- 简单dp
- 【华为OJ】超长正整数相加
- LightOJ 1197 Help Hanzo 求区间内素数的个数
- Kafka常用命令
- [ASP.NET MVC 小牛之路]02 - C#知识点提要
- 最大子段积
- 向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读
- SQL语句大全